java中Exception和Error

1.相同点。

Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),他是异常处理机制的基本组成类型。

2.不同点。

Exception是程序运行中可以预料的意外情况,可以并且应该被捕获并进行相应处理。

Exception又分为可检查异常和不检查异常(又叫运行时异常,继承了RunTimeException)。可检查异常就是平时写代码的时候需要捕获或者抛出的异常。不检查的异常在编译的时候不会强制要求处理异常。

Error是指正常情况下不太可能出现。绝大部分的error导致的的程序运行异常都是不可恢复的,因此也不需要捕获处理。

有时间的话应该了解一下常见的Error和Exception。

3.异常处理的原则。

(1)尽量不要捕获太笼统的异常,例如Exception。应当捕获特定异常,捕获的异常越详细处理时获得的信息就越多,容易处理。另外如果捕获Exception,那么那些本来不想捕获的运行时异常也会被捕获。

(2)不要生吞异常(生吞异常就是捕获了异常什么处理也不做,个人认为e.printStackTrace()也属于生吞异常,跟完全不做处理差别不大)。实在不清楚应该如何处理的时候就抛处理,到了外层根据业务逻辑可能就知道应该怎么处理了。

4.自定义异常。

自定义异常的时候应该注意两点:

(1)是否需要定义成checked Exception。捕获之后有对应的处理,可以使程序继续执行的异常才应该定义为checked Exception,否则就定义成RunTimeException。

(2)在保证诊断信息足够的同时,也要考虑避免包含敏感信息。

5.处理异常消耗性能需要注意的地方。

(1)在try..catch代码块中的代码jvm运行时会增加额外的开销,所以仅捕获必要的代码段就行。

(2)java每实例化一个Exception都会对当时的栈进行快照,这是一个比较重的操作,实例化Exception太多,会影响性能。

6.可不可以使用异常控制流程

虽然一般都是建议不要使用异常控制流程,但是依我的工作经验来说,有些情况还是可以使用异常来控制流程的。

情况就是异常很少出现,并且一旦出现也有对应的处理流程。比如下面的伪代码:

try {
插入数据库的操作;
} catch(Exception){
根据唯一索引查询数据库中是否已经有这条数据,有就表示已经插入成功;
}

这段代码的先决条件就是异常很少出现,出现的时候只要查到有对应的数据也算流程成功。虽然比条件语句低效,但是很少出现。

7.try-with-resource语句。

先看下面代码

 try(FileInputStream input = new FileInputStream("test.txt"); BufferedInputStream bufferedInput = new BufferedInputStream(input)){

       具体流程;
        }catch(){
}

这种写法是jdk7才开始有的,特点有(1)不需要使用finally。(2)关闭资源按照创建的逆序,防止有依赖(3)资源需要实现AutoCloseAble接口或者CloseAble接口。(4)使用finally的时候如果try和catch中都抛出了异常最终抛出的是finally里面的异常,而使用这种,最终抛出的是try中的异常。

8.NoClassDefFoundError 和ClassNotFoundException

NoClassDefFoundError产生的原因:jvm或者ClassLoader尝试加载类的时候却找不到类的定义。类在编译的时候是有的,但在运行的时候找不到了,一般出现的情况是jar包出现了损坏(我以前碰到过一次是引用了同名jar包的不同版本导致的,所以看到这个error建议优先考虑jar包有问题)。

ClassNotFoundException产生的原因:java支持使用class.forName方法来动态加载类,如果在类路径中没有找到就会抛出该异常(一般是没有编译,去路径下找)。还有一个原因是类已经由一个类加载器加载到内存中了,此时另外一个类加载器又尝试着动态从同一个

 

参考:杨晓峰《Java核心技术36讲》

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值