Throwable
Error
无法处理
Exception
`运行时异常` 是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等
`编译检查时异常` 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
异常处理 throws and throw
Throws抛出异常的规则:
1: 如果不可检查时异常,即Error、RuntimeException或它们的子类,那么可以不使用throws关键字
来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出
。
2: 如果一个方法可能出现可查异常(checked exception),要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。
3: 只有当抛出了异常时,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出
。
4: 调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。
如下test1()方法
后用throws
关键字用于抛出可能出的异常自定义异常Exception1
,在别处实际调用这个方法的事后有两种方式处理
1.就需要进try/catch处理这个异常Exception1
2.或者直接也抛出,留给后面调用的方法处理
package com.throwTest;
/**
* @author tli2
* @createDate 2022/5/12 14:09
*/
class Exception1 extends Exception {
public Exception1(String msg, Throwable e) {
super(msg, e);
}
public Exception1(String msg) {
super(msg);
}
}
public class ThrowTest {
public void test1() throws Exception1 {
throw new Exception1("自定义Exception1抛出");
// System.out.println("test1");
}
// 方式一
public static void main(String[] args){
ThrowTest throwTest = new ThrowTest();
try {
throwTest.test1();
} catch (Exception1 e) {
// 这里最好使用具体异常类来捕获
System.out.println(e.getClass() + "----" + e.getMessage());
}
}
// 方式二
// public static void main(String[] args) {
// ThrowTest throwTest = new ThrowTest();
// try {
// throwTest.test1();
// } catch (Exception1 e) {
// System.out.println(e.getClass() + "----" + e.getMessage());
// }
// }
}