Error和Exception有什么区别

Error和Exception有什么区别?

  1. Error和Exception都是继承了Throwable类,只有继承了Throwable类的异常才可以被声明抛出(throw)和捕捉(catch)

  2. Error和Exception都体现了java平台设计者对不同异常的分类处理,Exception是程序运行中可以预料的意外情况,应该做相应处理。Error是在正常情况下,不大可能发生的情况,大多数Error都会让你的程序挂掉,既然是非正常情况咯,就不便于捕获处理,就好比你不会现在就想好世界末日来了该怎么做一样。这些问题都让超级英雄去解决吧。

  3. Exception又分为检查异常(checked)和运行时异常(RuntimeException),检查异常在编译的时候就必须强制我们在源代码中显式的去处理,比如读取文件的时候,编译器会提示我们要处理个IOException,不管是抛出还是捕捉是吧。运行时异常则是运行时才能发现的异常,比如NPE,ArrayIndexOutOfBoundsException等,一般都是可以编码避免的逻辑错误,所以不会再编译期强制要求处理。

关于Error和Exception的一个形象比喻

  • 我记得以前在看到过一个很形象的比喻来描述Error和Exception,可以说是记忆犹新,大概是这样说的:

  • 某天,你开着辆车上山,车坏了,你一看,发现问题自己能解决,便拿出工具箱自己处理一下,继续上路(Exception被捕获,并得到处理,程序恢复正常继续运行)。

  • 车开到半山腰,发现车抛锚了,自己不知道怎么修,怎么办呢,只能打电话给汽车维修店,并说明什么什么问题,叫汽车维修店的人来解决了(在当前处理业务逻辑中,你不知道怎么处理这个异常,就把异常抛到更高业务层去处理)。这时候,你最好描述好具体的问题,这样汽车维修店的人就能快速定位到你的问题(在往上抛异常时,要捕获特定的异常,不要捕获Exception这样的异常,否则很难定位到具体的问题)。

  • 车又修好了,继续上路,往前走了一段路,拐个弯,发现前面的路坍塌了,我靠,坑爹啊,这时候你还能修吗,这就很难修了(Error:导致你运行环境进入不正常的状态,很难修复)。

  • 这个比喻就很形象的说明了Exception和Error的区别,一个是我们程序中还可以处理的情况,另一个则是程序中不好处理,一般很少出现的情况(比如公路塌方,要是路还正常我是可以继续走下去的是吧)。

异常处理注意的几个点:

  1. 尽量不要捕获Exception这样的异常,应该捕获特定的异常

  2. 不要捕获了异常不做任何处理,被你生吞。

  3. 我们应该从异常中尝试恢复程序而不应该从错误中恢复程序。

下面谈谈 NoClassDefFoundError 和 ClassNotFoundException 的区别,比较经典

  1. NoClassDefFoundError是一个错误,ClassNOtFoundException是一个异常,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。

  2. NoClassDefFoundError出现原因:如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError.造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。

  3. NoClassDefFoundError解决办法:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

  4. ClassNOtFoundException出现原因:Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。

  5. ClassNOtFoundException解决方法:确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。
    另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。通过控制动态类加载过程,可以避免上述情况发生。

 

参考文章:https://time.geekbang.org/column/82

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值