【问题标题】:Using try-catch java使用 try-catch java
【发布时间】:2019-10-07 01:38:40
【问题描述】:

所以刚刚了解了 Java 中 try-catch 语句的基础知识,我仍然对语法中的一些差异感到有些困惑。

这是我试图分析和理解的代码。使用try 然后catch(Exception e) 与仅使用throwsthrow new 相比有什么区别?

据我了解,trycatch 基本上是一种通过输出消息或传递给另一个方法来处理错误的方法。但是,我认为我停留在它的语法方面。

任何有建设性的 cmets 或简单的例子来阐明这个概念,以及我书中的示例代码发生了什么,我们将不胜感激。

/* Invalid radius class that contains error code */
public class InvalidRadiusException extends Exception {
     private double radius;

/** Construct an exception */
public InvalidRadiusException(double radius) {
       super("Invalid radius " + radius);
       this.radius = radius;
}

/** Return the radius */
public double getRadius() {
    return radius;
 }
}


public class CircleWithException {
/** The radius of the circle */

private double radius;

/** The number of the objects created */
private static int numberOfObjects = 0;

/** Construct a circle with radius 1 */
public CircleWithException() throws InvalidRadiusException {
       this(1.0);
  }

/** Construct a circle with a specified radius */
public CircleWithException(double newRadius) throws InvalidRadiusException {
          setRadius(newRadius);
          numberOfObjects++;
}

/** Return radius */
public double getRadius() {
     return radius;
}

/** Set a new radius */
public void setRadius(double newRadius)
    throws InvalidRadiusException {
if (newRadius >= 0)
  radius =  newRadius;
else
  throw new InvalidRadiusException(newRadius);
}

/** Return numberOfObjects */
public static int getNumberOfObjects() {
      return numberOfObjects;
}

/** Return the area of this circle */
public double findArea() {
    return radius * radius * 3.14159;
 }
}

【问题讨论】:

  • 你读过this吗?
  • 正确。然而,当你抛出一些东西,抓住它,然后将它传递给更多的方法,在 if-else 语句中使用它或者简单地说一些方法名称 + throws 这就是我的意思。
  • @Andy897 试试chat.stackexchange.com
  • @Andy897 我相信我们可以在聊天中进一步继续讨论。
  • @MarounMaroun 你的类比没有意义。

标签: java try-catch


【解决方案1】:

说明

来自Java documentation

[try 块] 包含一个或多个合法的 可能抛出异常的代码行。 (抓到最后 块将在接下来的两个小节中解释。)

异常是一种特殊的对象。当您编写new Exception() 时,您正在创建一个新的异常对象。当您编写 throw new Exception() 时,您正在创建一个新错误,然后将其扔到最近的 try-catch 块,中止您的其余代码。

当您抛出异常时,它会被嵌套在(内部)的 try-catch 块捕获。也就是说,假设为该异常注册了正确的 catch 块。如果代码没有包装在 try-catch 块中,则一旦抛出错误,程序就会自动关闭。对任何可能引发错误的代码或方法使用 try-catch,尤其是由于用户输入(在合理范围内)。

有些异常必须被捕获,有些是可选的。 (checked vs. unchecked).

当您将throws 添加到方法签名中时,您是在向其他方法宣布,如果它们调用该方法,则可能会引发已检查异常(未选中不需要)。注意它是throws 而不是throw。它不是在做一个动作,而是在描述它有时会做一个动作。

当您不想在该方法中捕获错误,但希望允许调用您的方法的方法自己捕获错误时,您可以使用此功能。

异常是一种让您的程序连贯地响应意外或无效情况的方法,在需要用户输入时特别有用,但在文件输入/输出等其他情况下也很有用。

示例

public CircleWithException() throws InvalidRadiusException {
       this(1.0);
}

这里,CircleWithException() 有可能引发 InvalidRadiusException(推测 this(1.0) 有时会引发 InvalidRadiusException。)

调用这个方法的代码应该有:

try {
    new CircleWithException(); // This calls the method above
} catch (InvalidRadiusException e) { // The object "e" is the exception object that was thrown.
    // this is where you handle it if an error occurs
}

正如我之前所说,异常只是扩展 Exception

的特定对象类型
/* Invalid radius class that contains error code */
public class InvalidRadiusException extends Exception {
     private double radius;

/** Construct an exception */
public InvalidRadiusException(double radius) {
       super("Invalid radius " + radius);
       this.radius = radius;
}

/** Return the radius */
public double getRadius() {
    return radius;
 }
}

上面的代码定义了一种特定于您的程序/应用程序的新异常类型。 Java 标准库中有许多预定义的异常,但您通常需要创建自己的异常。

要抛出这个异常,你首先创建一个 InvalidRadiusException 对象然后抛出它:

throw new InvalidRadiusException(1.0);

【讨论】:

    【解决方案2】:

    如果您不能(或不方便)处理方法内部的异常,您可以声明一个方法抛出异常。

    在您的情况下,您在构造函数中调用方法setRadius。如果您认为在构造函数中处理异常(由setRadius 抛出)很方便,您可以使用try-catch 子句:

    public CircleWithException(double newRadius) throws InvalidRadiusException {
        try {
            setRadius(newRadius);
            numberOfObjects++;
        } catch (InvalidRadiusException e) {
            setRadius(0); // for example
        }
    }
    

    catch 块包含抛出异常时您想要执行的操作。在这种情况下,我将半径设置为0,但您可以更改它。

    请记住,这取决于您的类实现以及您希望它们如何工作。如果你不希望构造函数处理这个异常,你可以抛出它(就像你已经在做的那样)并在其他方法中处理它。

    【讨论】:

    • 当你在第一行说 throws 时,你声明如果它抛出 InvalidRadiusException 或者它可能会抛出它?在哪种情况下,它是作为安全预防措施存在的?
    • 我想说的一些例子是你的构造函数。他们都抛出异常InvalidRadiusException。但请注意,他们不会“直接”这样做。他们调用了一个方法(实际上,它有 throw new InvalidRadiusException; 行)但不处理它。
    【解决方案3】:

    "throws" 是声明一个方法将抛出某些异常。这是由 java 编译器针对检查的异常强制执行的,而不是针对错误或未检查的异常。

    throw new”是java中的两个关键字,所以我们可以把它分解...

    • throw”是一个抛出异常的运算符
    • new”是创建对象新实例的运算符

    try”块允许您执行声明它们抛出异常的方法,这就是您使用“catch”子句的地方,以捕获那些抛出的异常。

    此外还有 try-with-resources 块,您可以在其中使用 try 块对实现 AutoCloseable 的可消耗资源(例如流)进行操作,然后关闭它。

    try 块还有“finally”子句,它允许您执行清理或任何其他必须在 try 阻塞,不管是否发生异常。

    【讨论】:

      【解决方案4】:

      有两种类型的异常

      1) 未选中。这些由ErrorRuntimeException 类及其所有子类定义。 Java 不会强迫您以任何方式处理这些异常。

      2) 已检查。这些被定义为Throwable 类及其所有不属于 (1) 中定义的类别的子类。 Java 强制您使用 try/catch 处理这些异常。如果您在 try 块之外调用可以抛出此类异常(使用 throws 关键字定义)的方法,您的代码将无法编译。

      throws :这是一种声明方法可能引发异常的方式,该异常必须用 try/catch 捕获。例如

      public void doSomething() throws MyException { ... }
      

      是一个可能抛出MyException实例的方法的声明。

      try/catch/finally :这是一种处理可能由某种代码产生的异常的方法。您尝试运行的代码位于try 块中,错误处理代码位于catch 块中。可选的finally 块是不管是否抛出异常都会被执行的东西。事实上,即使你在trycatch 中执行return,也会调用finally 块。例如

      try {
          doSomething();
      } catch (MyException exception) {
          exception.printStackTrace();
      }
      

      或使用finally 的示例:

      MyResource myResource = getMyResource();
      try {
          myResource.open();
          doStuffWithMyResource(myResource);
      } catch (Exception exception) {
          exception.printStackTrace();
      } finally {
          if (myResource.isOpen()) {
              myResource.close();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        相关资源
        最近更新 更多