Java中,什么是未选中和检查异常

所有Java异常都是异常类层次结构中的类的实例。
这可以表示如下:

  • java.lang.throwable - 这是所有异常类的基类。其方法和构造函数为所有例外实施了一系列功能。
  • java.lang.Exception - 这是所有正常例外的超类。
  • 各种标准和自定义异常类。
  • java.lang.runtimeexception - 这是未选中异常的所有正常异常的超类。
  • 各种标准和自定义运行时异常类。
  • java.lang.error - 这是所有“致命错误”异常的超类。

说明:

  • 下面描述了检查和未经检查的异常之间的区别。
  • Throwable,异常和Runtimeexception类应被视为摘要;见陷阱 - 投掷
    ROPLABLE,异常,错误或者runtimeException。
  • 在应用程序尝试恢复的情况下,JVM抛出错误异常。
  • 声明Cratical的Cullable Substypes是不明智的。 Java工具和库可能假设错误和异常是Rockable的唯一直接子类型,并且如果该假设不正确,则行为不当。

检查与未选中的异常

Java语言解决了检查的异常机制问题。
首先,Java将例外分为两类:

  • 检查的异常通常代表应用程序应该能够处理的预期事件。例如,IoException及其子类型表示I/O操作中可能发生的错误条件。示例包括,文件打开失败,因为文件或者目录不存在,网络读取和写入失败,因为网络连接已被打破等。
  • 未经检查的异常通常表示应用程序无法处理的意外事件。这些通常是应用程序中错误的结果。

(在下文中,“抛出”指的是明确抛出的任何异常(通过投掷语句),或者隐含地(在失败的解除引用,类型投用等中)。
类似地,“传播”是指在a中抛出的异常嵌套调用,并未在该调用中捕获。
下面的示例代码将说明这一点。

检查的异常机制的第二部分是对检查的方法有限制
可能发生异常:

当在方法中抛出或者传播检查后的异常时,必须由方法捕获,或者
在方法的抛出子句中列出。

当被检查的异常抛出或者在初始化程序块中传播时,必须抓住该块。

在字段初始化表达式中,无法通过方法调用传播检查的异常。

简而言之,必须处理或者声明检查的异常。

这些限制不适用于未经检查的异常。
这包括隐式抛出异常的所有情况,因为所有此类情况都会投掷未经检查的异常。

检查异常示例

这些代码片段旨在说明检查的异常限制。
在每种情况下,我们都显示了具有编译错误的代码的版本,以及纠正错误的第二个版本。

//This declares a custom checked exception.
public class MyException extends Exception {
     //constructors omitted.
}
//This declares a custom unchecked exception.
public class MyException2 extends RuntimeException {
     //constructors omitted.
}

第一个示例显示,如果不应在该方法中处理它们,则可以将显式抛出的检查异常声明为“抛出”。

//INCORRECT
public void methodThrowingCheckedException(boolean flag) {
    int i = 1/0; //Compiles OK, throws ArithmeticException
    if (flag) {
         throw new MyException(); //Compilation error
    } else {
         throw new MyException2(); //Compiles OK
    }
}
//CORRECTED
public void methodThrowingCheckedException(boolean flag) throws MyException {
     int i = 1/0; //Compiles OK, throws ArithmeticException
     if (flag) {
         throw new MyException(); //Compilation error
     } else {
         throw new MyException2(); //Compiles OK
     }
}

第二个例子显示了如何处理传播的被传播的异常。

//INCORRECT
public void methodWithPropagatedCheckedException() {
      InputStream is = new FileInputStream("someFile.txt"); //Compilation error
      //FileInputStream throws IOException or a subclass if the file cannot
      //be opened. IOException is a checked exception.
…
}
//CORRECTED (Version A)
public void methodWithPropagatedCheckedException() throws IOException {
     InputStream is = new FileInputStream("someFile.txt");
…
}
//CORRECTED (Version B)
public void methodWithPropagatedCheckedException() {
     try {
         InputStream is = new FileInputStream("someFile.txt");
         …
     } catch (IOException ex) {
         System.out.println("Cannot open file: " + ex.getMessage());
     }
}

最终示例显示了如何在静态字段初始化程序中处理已检查的异常。

//INCORRECT
public class Test {
     private static final InputStream is =
          new FileInputStream("someFile.txt"); //Compilation error
}
//CORRECTED
public class Test {
      private static final InputStream is;
      static {
            InputStream tmp = null;
            try {
                tmp = new FileInputStream("someFile.txt");
            } catch (IOException ex) {
                System.out.println("Cannot open file: " + ex.getMessage());
            }
            is = tmp;
     }
}

请注意,在此最后一个情况下,我们还必须处理无法分配给多次的问题,并且即使在异常的情况下也必须分配给。

日期:2020-06-02 22:15:21 来源:oir作者:oir