目录
1、继承关系
我们常见的Exception都继承于Throwable类,除了我们无法控制OOM异常的Error分类外,我们可以接触到的异常主要分为两类:1、运行时异常(非检查异常);2、非运行时异常(检查异常)
2、异常处理
对于RuntimeException,我们一般是不需要用try/catch块处理的,因为大部分的RuntimeException都是因为逻辑问题导致的,比如ArrayIndexOutOfBoundsException。
try/catch 块是用来处理真正的异常的,也就是检查异常,对于逻辑导致的RuntimeException,我们尽量不用try处理,而应该暴露异常,然后完善逻辑。
下面的ArrayIndexOutOfBoundsException用了try块,只是为了讲解try的作用。
/**
* 1、对于检查异常,调用方必须处理该异常
* 2、处理方式一:加try 块
* 3、处理方式二:继续抛出异常,让更上一层调用方处理
*/
private static void testTry2() throws IOException{
testIOException();
}
/**
* 检查异常:1、我们必须声明一下它可能抛出异常(throws IOException )
* 2、该异常也一定会抛给调用方
*/
private static void testIOException() throws IOException {
throw new IOException ("IO出问题了!");
}
3、try/catch块
/**
* 1、对于非检查异常,我们不加try catch 块也不会报错
* 2、但是,如果我们不处理异常,程序运行时将直接奔溃
* 3、在try catch模块中我们可以尝试修复异常,
*/
private static void testTry() {
try {
testException();
System.out.println("发生异常后,会立马转到catch模块,所以我是不会被打印的");
return;
} catch (ArrayIndexOutOfBoundsException e) {
//尝试修复异常····
e.printStackTrace(); // 如果无法恢复异常,我们至少应该打印异常信息
}finally {
System.out.println("不管有没有return,我都会执行"); // 不管try 或者catch块中有没有return 语句,这里都会执行
}
System.out.println("处理异常后,我还能运行!"); //因为我们处理了异常,所以往后的程序还能继续运行
testTry1();
}
private static void testTry1() {
testException();
System.out.println("不处理异常,我无法运行!"); //到这里之前程序就奔溃了,所以这行不会打印出来
}
/**
* 非检查异常:我们可以不声明抛出的异常
*/
private static void testException() {
throw new ArrayIndexOutOfBoundsException("指针越界了!");
}