异常处理
类结构关系
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
public class TestThrows {
public static void main(String[] args) throws InputMismatchException {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
}
}
当然,调用者也可以不进行这个异常的处理,继续扔给上一层(调用者的调用者)处理
throw
在执行某个方法的时候,可以随时抛出一个异常,如
自定义异常
首先,Java 除了 POD,都是类。
通常情况下,自定义的异常,是 java.lang.Exception
的子类
Java 当中,类继承需要使用 extends
关键字
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
的选项