1.捕获异常
1.1catch
public static void main() {
try {
process1();
process2();
process3();
} catch (IOException e){
e.printStackTrace();
}
}
try{...} catch(){...}
- 使用try...catch捕获异常
- 可能发生异常的语句放在try {...}中
- 使用catch捕获对应的Exception及其子类
public static void main() {
try {
process1();
process2();
process3();
} catch (IOException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
System.out.println(e);
}
}
可以使用多个catch子句:
- 每个catch捕获对应的Exception及其子类
- 从上到下匹配,匹配到某个catch后不再继续匹配
public static void main() {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println("IO error");
} catch (UnsupportedEncordingException e) {
System.out.println("Bad encoding");
}
}
catch(UnsupportedEncodingExeption e)是错误的
catch的顺序非常重要:
- 子类必须写在前面
1.2finally
如何编写无论错误是否发生都必须执行的语句?
public static void main(String[] args){
try {
process1();
process2();
process3();
System.out.println("END");
}catch (UnsupportedEncodingException e) {
System.out.println("Bad encoding");
System.out.println("END");
}catch (IOException e) {
System.out.println("IO error");
System.out.println("END");
}
}
finally语句块保证有无错误都会执行
- finally不是必须的
- finally总是最后执行
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");
}
}
1.3multi-catch
如果某些异常的处理逻辑相同:
- 不存在继承关系,必须编写多条catch子句
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");
}
}
- 可以用“|”表示多种Exception
public static void main(String[] args){
try {
process1();
process2();
process3();
}catch (IOException | NumberFormatException e) {
System.out.println("Bad input");
}catch (Exception e) {
System.out.println("Unknown error");
}
}
public class Main {
public static void main(String[] args){
//process("abc");
process("0");
}
static void process(String s) {
try {
int n = Integer.parseInt(s);
int m = 100 / n;
} catch (NumberFormatException | ArithmeticException e) {
System.out.println(e);
System.out.println("Bad input.");
}finally {
System.out.println("end process.");
}
}
}
2.总结
- catch子句的匹配顺序非常重要,子类必须放在前面
- finally子句保证有无异常都会执行
- finally是可选的
- catch可以匹配多个非继承关系的异常(JDK>=1.7)