文章目录
- 异常层次结构
- Error和Exception区别
- 异常分类
- 异常处理机制
- 抛出异常
- 捕获异常
- 创建异常类
异常层次结构
在Java程序中,异常对象都是炮声与Throwable类的一个实例。
我们可以看到Throwable有两个是实现类Error
和Exception
。Java异常也分为两类:Error和Exception。
Error和Exception区别
- Error:(错误)总是不可控制的(Unchecked),一般是虚拟机相关的问题,如系统崩溃、虚拟机出现错误、动态链接失败等,这些错误无法恢复或者不可能捕获。
- Exception:(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
异常分类
Exception分为运行时异常和非运行时异常。
运行时异常:运行时异常都是RuntimeException类及其子类异常。如NullPointerException(空指针异常)。
非运行时异常:非RuntimeException类及其子类。从语法角度上说都是必须进行异常处理的,如果不处理,程序就不能通过编译。如IOException、SQLException等以及用户自定义的Exception异常。
异常处理机制
Java的异常处理机制有:抛出异常、捕捉异常。
抛出异常
抛出异常使用throw语句,将异常交给调用者处理。
throw:用于抛出异常。
throws : 用在方法签名中,用于声明该方法可能抛出的异常。
public static void main(String[] args) throws Exception {
testE();
}
public static void testE() throws Exception {
throw new Exception();
}
捕获异常
捕获异常需要使用到try-catch语句。
try-catch语法
try{
//可能发生异常的代码
} catch(异常类型1 e1){
//捕获处理try抛出的异常类型
} catch(异常类型2 e2){
//捕获处理try抛出的异常类型
}
Java运行时环境接收异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,就把异常对象交给catch块处理,这个过程叫做捕获异常。如果捕获不到异常的catch块,运行时环境就会终止,Java程序也会退出。
Exception是异常类的子类,有多个catch块时,如果把Exception异常放在前面,一旦发生异常,就会直接找到这个Exception这个catch块。这样后面的catch就永远不会执行了。因此,一个Exception异常放在最后捕获,也就是说父类异常的catch应该排在子类异常catch块的后面(先处理小异常,再处理大异常)。
try-catch-finally语法
try{
//可能发生异常的代码
} catch(异常类型1 e1){
//捕获处理try抛出的异常类型
} catch(异常类型2 e2){
//捕获处理try抛出的异常类型
}finally{
//回收资源代码
}
有时,在try块里打开了一些物理资源(如:数据库连接。网络连接、磁盘文件),finally块是一般用于回收这些物理资源的。
Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中的对象占用的内存。
finally是放在最后面的。异常处理中,try是必须的,没有try就没有catch和finally块;但是catch块和finally是可选的。但是catch和finally块至少出现其中之一。
不过程序有没有捕获到异常finally都是会被执行的,除非在try块或catch退出了虚拟机;而catch只有捕获到对应异常才会执行。
finally块不执行的情况
try{
...
System.exit(0);
}finally{
不执行
}
下面始终返回false
//始终返回false
public boolean test(){
try{
return true;
}finally{
return false;
}
}
创建异常类
public class MyException extends Exception{
public MyException() {
}
public MyException(String message) {
super(message);
}
}
当业务逻辑层访问持久层出现SQL异常时,程序不应该把底层的SQLException异常传到用户界面,原因如下:
- 对于正常用户而言,他们不想看到底层SQLException,SQLException对他们使用系统没有帮助
- 对于恶意用户而言,将SQLException暴露出来不安全。