异常
异常的分类
- 检查性异常:在编译时出现的异常
- 运行时异常:在编译时没有问题,但是在运行时出现了的异常
- 错误:错误不是异常,而是脱离程序员控制的问题,如栈溢出。
Exception 类的层次
java内置异常类
java定义了一些异常类在 java.lang 标准包中。如ArithmeticException
、ArrayIndexOutOfBoundsException
等等。
异常方法
下面是 Throwable 类的主要方法
方法 | 描述 |
---|---|
String getMessage() | 返回发生异常的详细信息,这个消息在 Throwable类的构造函数初始化了 |
Throwable getCause() | 返回一个Throwable对象,代表异常原因 |
toString() | 使用getMessage() 的结果返回类的串级名字 |
void printStackTrace() | 打印toString的结果和栈层次的 System.err,即错误输出流 |
StackTraceElement[] getStackTrace() | 返回一个包含堆栈层次的数组,下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底 |
Throwable FillInStackTrace() | 用当前的调用栈层次填充Throwable对象栈层次,添加到栈层次任何先前信息中。 |
捕获异常
try-catch
try{
// 代码
}catch(Exception e){
// 错误处理
}
多重捕获
try{
// 代码
}catch(异常类型1 e1){
// 错误处理
}catch(异常类型2 e2){
// 错误处理
}catch(异常类型3 e3){
// 错误处理
}
finally
try{
// 代码块
}catch(Exception e){
// 错误处理
}finally{
// 最终处理
}
需要注意的是,不管代码是否出现错误,或者存在return等情况,finally一定会在执行完代码块后执行。
throws 和 throw 关键字
- throws可以向上抛出一个可能存在的异常,而不是通过 try-catch 处理这个可能存在的异常。throws一般在一个方法的参数列表的尾部,它可以同时抛出多个异常,但是要用逗号隔开
- throw 可以手动抛出一个异常,无论他是新实例化的还是刚捕获到的。
声明自定义异常
在java中可以自定义异常,但是要注意:
-
所有异常都必须是 Throwable 的子类
-
如果希望写一个检查性异常,要继承 Exception 类。
-
如果想写一个运行时异常,那么要继承RuntimeException类。
class MyException extends Exception{ }
通用异常
在java中定义了两种类型的异常和错误
-
jvm异常:由 jvm 抛出的异常或错误。如:
NullPointerException
在java中定义了两种类型的异常和错误 -
jvm异常:由 jvm 抛出的异常或错误。如:
NullPointerException
-
程序级异常:由程序或api程序抛出的异常。如:
IllegalStateException