异常处理
Error
表示严重的错误,程序对此一般无能为力,例如:
OutOfMemoryError
:内存耗尽NoClassDefFoundError
:无法加载某个ClassStackOverflowError
:栈溢出
而Exception
则是运行时的错误,它可以被捕获并处理。
某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:
NumberFormatException
:数值类型的格式错误FileNotFoundException
:未找到文件SocketException
:读取网络失败
还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:
NullPointerException
:对某个null
的对象调用方法或字段IndexOutOfBoundsException
:数组索引越界
// 异常捕获语法格式
try{
// 可能会发生异常的代码
}catch(异常类型 e){
System.out.println(e); // 打印异常信息
}
try{
// 可能会发生异常的代码
}catch(Exception e){ // Exception万能捕获
System.out.println(e); // 打印异常信息
}
// 可以用catch捕获多个
// 需要注意的是多个catch语句只有一个能被执行,子类必须写在前面,不然不会被捕获
try{
// 可能会发生异常的代码
}catch(异常类型 e){
System.out.println(e); // 打印异常信息
}catch(异常类型 e){
System.out.println(e); // 打印异常信息
}catch(异常类型 e){
System.out.println(e); // 打印异常信息
}catch(异常类型 e){
System.out.println(e); // 打印异常信息
}catch (IOException | NumberFormatException e) {
// 如果两个异常的代码相同,我们可以用|把他们连接在一起
System.out.println("Bad input");
} finally {
System.out.println("END");
// 不论有没有错误都会执行,保证一些代码必须执行,有时可写可不写
}
抛出异常
调用printStackTrace()可以打印异常的传播栈,对于调试非常有用;
捕获异常并再次抛出新的异常时,应该持有原始异常信息;
通常不要在finally中抛出异常。如果在finally中抛出异常,应该原始异常加入到原有异常中。调用方可通过Throwable.getSuppressed()获取所有添加的Suppressed Exception。