0%

Java异常及异常处理

Java异常简介

Throwable是万恶之源,它是所有异常的父类,它有两个儿子,大儿子叫Error,二儿子叫Exception。

1、Error是系统错误,很少出现,是程序的终结者,我们一般不会期待它的出现。Error有两个儿子,分别是VirtualMachineError和ThreadDath。

2、Exception:它的出现一般是因为编码、环境、用户操作输入出现问题而导致的。

Exception也是有两个儿子,一个叫非检查异常,另一个叫检查异常。

  • 非检查异常 RuntimeException:由Java虚拟机自动抛出,并且自动捕获。一般是代码有问题。
  • 检查异常:与RuntimeException不同,需要收到添加、捕获和处理。

它们的关系图如下:

1
2
3
4
5
6
7
8
9
graph LR
A(Throwable) --> B(Error)
A --> C(Exception)
B--> D(VirtualMachineError)
B--> E(ThreadDath)
C--> F(非检查异常 RuntimeException)
C--> G(检查异常)
G-->H(文件异常 IOException)
G-->I(SQL异常 SQLException)

try…catch…finally实现异常处理

用try-catch-finally处理异常的格式如下:

1
2
3
4
5
6
7
8
9
10
try {
//一些会抛出异常的方法
}catch(Exception e) {
//处理该异常的代码块
}catch(Exception2 e) {
//处理Exception2的代码块
}...(n个catch块)... {
}finally {
//最终要执行的一些代码
}

try-catch必须一起用,不过catch有多少个取决于try模块中有多少种代码可能出现异常,每个处理一种异常。

try-catch-finally程序先执行try中的程序,当出现异常时在catch中寻找对应的处理方法,最后执行finally。

注意:catch语句中异常必须遵循“先子类,后父类”的原则。

测试代码如下:

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
public class TryCathTest {
public static void main(String[] args) {
TryTest tt = new TryTest();
System.out.println("test返回值:" + tt.test());
}
}

class TryTest{
public int test() {
int a = 100;
int div = 10;
int result = 0;
try {
while(div>-1) {
div--;
result = a/div;
}
return result;
}catch(Exception e) {
// 打印出异常e
e.printStackTrace();
System.out.println("执行catch.....");
}finally {
System.out.println("执行finally.....");

}
return result;
}
}

运行结果:

1
2
3
4
5
6
java.lang.ArithmeticException: / by zero
执行catch.....
执行finally.....
at com.imooc.exception.TryTest.test(TryCathTest.java:20)
at com.imooc.exception.TryCathTest.main(TryCathTest.java:8)
test返回值:100

分析程序与运行结果:

test()方法中会出现a/0的情况,这样会抛出一个Exception的异常,被catch捕获到了。之后便是打印出了捕获到的异常“java.lang.ArithmeticException: / by zero”,执行后面的输出语句。再之后执行finally里面的语句,输出“执行finally…..”。最后,执行finally外的语句,返回当出现异常前result的值。

Java异常链