原文链接:https://www.cnblogs.com/Time25/p/20023887.html

异常捕获规程

1.只有要给catch的代码块会被执行

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println(e);
}
}

2.catch要按照先放子类,再放父类,因为如果只先放父类,出现子类的异常就被父类的那个catch捕获了,那么子类就永远捕获不到

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println("IO error");
} catch (UnsupportedEncodingException e) { // 永远捕获不到
System.out.println("Bad encoding");
}
}
///UnsupportedEncodingException异常是永远捕获不到的,因为它是IOException的子类。当抛出UnsupportedEncodingException异常时,会被catch (IOException e) { ... }捕获并执行。
///这样写的是会报错的,而且,既然父类的异常捕获可以捕获子类的,那么为什么还要加个子类的异常捕获呢?因为日常生活中,可能会出现就是要求你明确的指出是哪些异常,精确打击

3.如果我们希望就是捕获完异常之后又,不管有没有错,都打印一个end该怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (UnsupportedEncodingException e) {
System.out.println("Bad encoding");
} catch (IOException e) {
System.out.println("IO error");
} finally {
System.out.println("END");
}
}
///无论有没有错,都是会打印finally里面的内容,甚至可以没有catch只有try和finally,finally也是可以写可以不写的

多种异常捕获
如果某些异常的处理逻辑相同,但是异常本身不存在继承关系,那么就得编写多条catch子句:
但是有些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
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println("Bad input");
} catch (NumberFormatException e) {
System.out.println("Bad input");
} catch (Exception e) {
System.out.println("Unknown error");
}
}

///如果是这样,那么就可以用|把相同逻辑的异常给合并
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException | NumberFormatException e) {
// IOException或NumberFormatException
System.out.println("Bad input");
} catch (Exception e) {
System.out.println("Unknown error");
}
}

// TRAINING LOG · 第 64 / 76 篇训练记录 · 成文于 2026.05.12 · 下午 16:52