Java面向对象设计 - Java异常类
异常类层次结构
异常类层次结构从java.lang.Throwable类开始。
当抛出异常时,它必须是Throwable类的对象或其任何子类。
catch块的参数必须是Throwable类型,或其子类之一,例如Exception,ArithmeticException,IOException等。
我们可以通过从一个异常类继承我们的类来创建我们自己的异常类。
使用多个catch块
Java运行时选择适当的catch块,并从第一个catch块开始顺序寻找合适的catch时钟。
try块的多个catch块必须从最具体的异常类型排列为最通用的异常类型。
以下代码使用多个catch块的有效序列。
ArithmeticException类是RuntimeException类的子类。
如果这两个异常都在同一个try块的catch块中处理,那么最具体的类型,即ArithmeticException,必须出现在最通用的类型之前,即RuntimeException。
try { // Do something, which might throw Exception } catch(ArithmeticException e1) { // Handle ArithmeticException first } catch(RuntimeException e2) { // Handle RuntimeException after ArithmeticException }
已检查和未检查异常
有三种类型的异常:
- 有一些例外,有更高的可能发生。我们可以在try-catch块中处理它们。或者我们可以在调用方法/构造函数声明中指定它可能抛出异常。
- 错误是可能发生的异常,并且我们几乎不能处理它。例如,java.lang.OutOfMemeoryError。我们不能做任何事情从内存不足错误中恢复。
异常类层次结构中的类,它们是Error类的子类和Error类本身,属于此类别的异常。
编译器不坚持对我们的代码采取行动。如果在运行时抛出此类异常,运行时将通过显示详细的错误消息并暂停应用程序来处理它。 - 在运行时可能会发生异常,我们可能会从异常条件中恢复。
异常类层次结构中的类,它们是RuntimeException类的子类和RuntimeException类本身,属于此类别。
编译器不坚持对我们的代码采取行动。
第一类中的异常称为检查异常,因为编译器检查它们是否在代码中处理。
Throwable类,Exception类和Exception类的子类(不包括RuntimeException类及其子类)称为检查异常。
所有未检查异常的异常称为未检查异常,因为编译器不检查它们是否在代码中处理。
Error类,Error类的所有子类,RuntimeException类及其所有子类都是未检查的异常。
我们可以处理未检查的异常,如果我们想,编译器不会强迫我们这样做。
用于处理已检查或未检查异常的程序结构是相同的。
以下代码显示如何处理已检查的异常:
import java.io.IOException; public class Main { public static void main(String[] argv) { try { int input = System.in.read(); if (input != -1) { System.out.println(input); } } catch (IOException e) { System.out.print("IOException occurred."); } } }