所有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