类Throwable: 所有错误和异常的超类
其直接子类:
Error (错误异常):是程序中无法处理的错误
Exception(异常):程序可以捕获并且可以处理的异常。
Exception异常分为两类:运行时异常和编译异常。
运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。比如说试图使用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
编译异常(受检异常):Exception中除RuntimeException极其子类之外的异常。如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,否则编译不通过。在程序中,自定义异常类通常不会直接继承该异常类,推荐定义运行时异常。
Error,Exception,RunTimeException的常见异常
Error:
StackOverflowError:当应用程序递归太深而发生内存溢出时,抛出该错误。
Exception:
IOException,
NoSuchMethodException,
NoSuchFieldException,
SQLException,
ClassNotFoundException
RunTimeException:
ConcurrentModificationException(并发异常)
NullPointerException(空指针异常)
IllegalArgumentException(参数不合法异常)
IndexOutOfBoundsException(越界异常)
ClassCastException(类型强转异常)
ArithmeticException(算术异常)
String getMessage(): 获取异常的描述信息,原因(提示给用户的时候,就提示错误原因).
String toString(): 获取异常的类型和异常描述信息(不用).
void printStackTrace(): 打印异常的跟踪栈信息并输出到控制台. 不需要使用System.out.println().
包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace.
测试时在catch语句块中,应写上e.printStackTrace();目的:查看异常的具体信息,方便调试和修改.
处理异常:
声明异常: throws
捕获异常:
try{
编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}finally{
}
抛出异常: throw
自定义异常:
继承Exception或子类,一般继承于RunTimeException
自动关闭资源:
try(
OutputStream out = new FileOutputStream("");
){
out.write(1);
}catch(Exception e){
e.printStackTrace();
}
处理异常的原则:
1:异常只能用于非正常情况,try-catch的存在也会影响性能.
2:需要为异常提供说明文档,比如Java doc,如果自定义了异常或某一个方法抛出了异常,我们应该记录在文档注释中..
3:尽可能避免异常,如NullPointerException
4:异常的粒度很重要,应该为一个基本操作定义一个 try-catch 块,不要为了简便,将几百行代码放到一个 try-catch 块中.
5:不建议在循环中进行异常处理,应该在循环外对异常进行捕获处理(在循环之外使用try-catch).
6:自定义异常尽量使用RuntimeException类型的.