Exception与Error简单解析

Exception与Error的异同

在这里插入图片描述

  1. Exception与Error都继承了Throwable类
  2. Exception是程序正常运行中,可以预料的意外情况,可能并且应该捕获,并进行相应的处理
  3. Error是在正常情况下不太可能出现的情况,绝大部分Error都会导致程序处于非正常的、不可恢复状态,是不便于也不需要进行捕获。例如,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。
  4. Exception可以分为可检查异常(非运行时异常,如上图的IOException)和不检查异常(运行时异常,如上图的RuntimeException),可检查异常是在源代码里面必须进行捕获处理的,是作为编译器检查的一部分。不检查异常,通常是可以通过编码避免的逻辑错误,具体根据需要来判断是否进行捕获,不是编译检查的一部分。

异常处理方式

  1. 使用try…catch…finally进行捕获;
  2. 在产生异常的方法声明后面写上throws,某一个Exception类型,如throws Exception,将异常抛出到外面一层去。 对于运行时异常(RuntimeException),可以对其进行处理,也可以不处理。推荐不对运行时异常进行处理。
  3. try-with-resources 与 mutiple-catch 方式
try (BufferedReader br = new BufferedReader();
     BufferedWriter writer = new BufferedWriter()) {// Try-with-resources
// do something
catch ( IOException | XEception e) {// Multiple catch
   // Handle it
}

异常处理原则

  1. 尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定的异常,如FileNotFoundException
  2. 不要生吞异常,应该讲异常抛出到上层或是输出到日志中
  3. 捕获异常时,不能简单输出到e.printStackTrace();,因为在复杂的系统中,不知道异常到底输出到哪里了,应该使用产品日志,详细输出到日志系统中
  4. 使用throw early,catch late原则
  5. 由于try-catch代码会造成额外的性能开销,并且会影响JVM对代码进行优化,所以我们应该仅捕获必要的代码段,而不是用一个大的try包住整段代码
  6. 不要使用异常控制代码流程

ClassNotFoundException和NoClassDefFoundError的区别

NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中错误和异常是有区别的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。

ClassNotFoundException产生的原因

  1. Java支持使用Class.forName、ClassLoader.loadClass、ClassLOader.findSystemClass等方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。(也就是去加载不存在的类)
  2. 当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。(尝试用不同的类加载器加载已经加载的类)
  3. 解决方案:唯一需要做的就是要确保所需的类连同它依赖的包存在于类路径中

NoClassDefFoundError产生的原因

如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError.(也就是找不到已编译好的类,即Class文件,可能是丢失jar包)

加载时从外存储器找不到需要的class就出现ClassNotFoundException
连接时从内存找不到需要的class就出现NoClassDefFoundError

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值