异常与异常处理
- 异常简介:异常处理的作用、Java异常体系结构简介
- 处理异常:try-catch以及try-catch-finally、抛出异常、自定义异常、异常链
- 这篇博客有助于加深对Java中的异常理解 (opens new window)
# 1. 异常简介
异常:有异于常态,和正常情况不一样,有错误出现。阻止当前方法或作用域,称之为异常。
- Throwable: (1). Error:虚拟机错误(VirtualMachineError)、线程死锁(ThreadDeath) (2). Exception: a. 非检查异常(RuntimeException):空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticExceptior) b. 检查异常(CheckException):文件异常(IOException)、SQL异常(SQLException)
# 2. Java中使用try..catch..finally实现异常处理
处理异常 try-catch以及try-catch-finally
try{
//一些会抛出异常的方法
}catch(Exception e){
//处理该异常代码块
}catch(Exception2 e){
//处理Exception2代码块
}...(n个catch块)...{
}finally{
//最终将要执行的一些代码
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 3. Java中的异常抛出以及自定义异常
- 异常抛出 throw —— 将产生的异常抛出(动作) throws —— 声明将要抛出何种类型的异常(声明)
public void 方法名(参数列表)
throws 异常列表{
//调用会抛出异常的方法或者:
throw new Exception();
}
1
2
3
4
5
2
3
4
5
- 自定义异常
class 自定义异常类 extends 异常类型{
}
1
2
3
2
3
例:“喝大了”异常
public class DrunkException extends Exception{
public DrunkException(){
}
public DrunkException(String message){
super(message);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 4. Java中的异常链
public class ChainTest {
/*
* test1():抛出“喝大了”异常
* test2():调用test1(),捕获“喝大了异常”,并且包装成运行时异常,继续抛出
* main方法中,调用test2(),尝试捕获test2()方法抛出的异常
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ChainTest ct = new ChainTest();
try {
ct.test2();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void test1() throws DrunkException{
// TODO Auto-generated method stub
throw new DrunkException("喝车别开酒");
}
public void test2() {
try {
test1();
} catch (Exception e) {
// TODO: handle exception
RuntimeException newExc = new RuntimeException(e);
// newExc.initCause(e);
throw newExc;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 5. 实际应用中的经验总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源
编辑 (opens new window)
上次更新: 2021/02/16, 14:20:12