异常处理
类结构关系
java.lang.Object > java.lang.Throwable > java.lang.Exception = java.lang.Error = java.lang.VirtualMachineError
java.lang 这个包里面的东西,不需要 import 就可以使用。
try - catch - finally
详细的解答,参考 https://www.geeksforgeeks.org/flow-control-in-try-catch-finally-in-java/
概括来说,无论 try 当中的异常有没有被 catch 处理,finally 总是会执行
当不知道要捕捉的异常的具体类型,可以写 catch (Exception e) {};但这种应该放在所有已知类型捕捉的后面
throws
比如下面这种写法(在方法的后面加上 throw 异常名),就会把这个异常扔给调用者去处理
特别的,main() 的调用者是 JVM
java
public class TestThrows {
public static void main(String[] args) throws InputMismatchException {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
}
}当然,调用者也可以不进行这个异常的处理,继续扔给上一层(调用者的调用者)处理
throw
在执行某个方法的时候,可以随时抛出一个异常,如
java
public static void main(String[] args) {
// blabla
throw new MyException();
}自定义异常
首先,Java 除了 POD,都是类。
通常情况下,自定义的异常,是 java.lang.Exception 的子类
Java 当中,类继承需要使用 extends 关键字
java
public class MyException extends Exception {
public MyException() {
super("message to display");
}
}其中,super() 是 Java 当中的一个关键字,用于调用父类的 constructor。
assert
Java 的 assertion 与 C 当中的不同。Java 当中的语法是 assert <bool expr> : <msg>
若布尔表达式的值为 false,则抛出 java.lang.AssertionError,并显示信息
注意,若要启用 assert 的功能,必须给 JVM 提供 -ea 的选项