Java异常(九)

异常层次结构


        在Java程序中,异常对象都是炮声与Throwable类的一个实例。
在这里插入图片描述
        我们可以看到Throwable有两个是实现类ErrorException。Java异常也分为两类:Error和Exception。
在这里插入图片描述

Error和Exception区别

  1. Error:(错误)总是不可控制的(Unchecked),一般是虚拟机相关的问题,如系统崩溃、虚拟机出现错误、动态链接失败等,这些错误无法恢复或者不可能捕获。
  2. 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异常传到用户界面,原因如下:

  1. 对于正常用户而言,他们不想看到底层SQLException,SQLException对他们使用系统没有帮助
  2. 对于恶意用户而言,将SQLException暴露出来不安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值