Java中的异常
异常的抛出
throw
通过[^throw new 异常类名();]可以抛出一个异常(默认初始化)。
public class ThrowTest {
public static void main(String[] args) {
Integer a = 1;
Integer b = null;
if (a == null || b == null) {
throw new NullPointerException();
} else {
System.out.println(a + b);
}
}
}
Exception in thread "main" java.lang.NullPointerException
at ThrowTest.main(ThrowTest.java:8)
throws
关键字throws用于修饰方法,表示该方法可能抛出某异常,并交由上一层处理。对于受检异常,若方法内不能处理,则必须向上抛出,交给上一层处理。throws也可以修饰main方法。
检测点
try-catch块
try-catch块用于执行可能抛出异常的代码,catch块将捕获抛出的异常并进行相应的处理。在try,catch之后还可以加上一个finally块,当try-catch块执行结束后,该代码块将被执行。
检测点
捕获多个异常
try块后面可以跟多个catch块,用于捕获不同类型的异常。抛出异常后,catch块会按顺序检测异常是否为它所捕获的类型或其子类。当一个catch块被执行后,后面的catch块将被跳过。故子类异常的catch块应放在父类异常类前面,否则将形成死代码。
检测点
自定义异常
实际编程中异常种类是非常繁杂的,为了更清楚地表达异常的含义,我们可以自定义异常。自定义异常很简单,我们只需定义一个继承自任意已知异常类的类就行了,并按照需要定义参数与父类一致的构造方法,并在构造方法里面直接调用父类构造方法就可以了。如图
由于异常类的公共父类Exception实现了Serializable(可序列化)接口,故需要定义一个
private final static long serialVersionUID = 12347901348033L;
来进行表识。
处理这个异常的方法与api里面异常是一样的
测试类
检测点
printStackTrace
这个方法可以用来输出抛出异常的栈轨迹,据此可以知道异常是在哪个文件的哪一行抛出的。可以方便开发人员查错。
如图
public class ExceptionStackTrace {
private static void method1() {
method2();
}
private static void method2() {
throw new NullPointerException();
}
public static void main(String[] args) {
try {
method1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出
java.lang.NullPointerException
at ExceptionStackTrace.method2(ExceptionStackTrace.java:7)
at ExceptionStackTrace.method1(ExceptionStackTrace.java:3)
at ExceptionStackTrace.main(ExceptionStackTrace.java:11)
检测点
最终通过截图