快速到达看这里-->
Java中的Exception和Error有什么区别?
概念
- Exception是程序正常运行中预料到可能会发生的错误,并且应该被捕获并进行相应的处理,是一种异常。
- Error是正常情况下不可能发生的错误,会导致JVM处以一种不可恢复的状态
Exception分类
- 编译时异常(可检查异常Checked)表示编译器检测到这段代码在运行时可能会发生异常,要求我们对异常进行处理。
- 运行时异常(不可检查异常unckecked)表示运行时出现的异常,通常是编码时的逻辑错误,不会强制要求编译器处理
编译时异常如:IOException、SQLExpection等
运行时异常如:NullPointerException、ArrayIndexOutOfBoundsException等
NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
- ClassNotFoundException:通常在使用Class.forName方法时,会传入一个类路径动态的进行加载,当找不到时就会出现这个异常。一般是类的名字传错了导致的。
- NoClassDefFoundError:创建一个类的实例对象时,却找不到类的定义了。但是要查找的类在编译时是存在的,在运用找不到了,就会出现这个错误。一般是打包时漏掉了这个类或者jar包数据被篡改已经损坏了。
Throwable、Error和Exception之间的层次
分析异常处理的不当
案例一
try {
// 业务代码
// …
Thread.sleep(1000L);
} catch (Exception e) {
// Ignore it
}
分析
- 尽量不要捕获Exception这种通用异常,应该捕获特定的异常,以提高代码可读性
- 不要生吞异常,如果不抛出来或者不输出到日志,程序出错后很难判断异常在哪里抛出,以及是什么原因抛出
案例二
try {
// 业务代码
// …
} catch (IOException e) {
e.printStackTrace();
}
分析
printStackTrace输出的内容在控制台可以看见,但是在分布式的生产环境下,如果发生异常,无法找到输出位置,最好是将异常输出到日志系统中去。
finally相关考点
finally不会被执行的情况
- try-cach 异常退出。
try{
system.exit(1)
}finally{
print(abc)
}
- 无限循环
try{
while(ture){
print(abc)
}
}finally{
print(abc)
}
finally执行对结果造成的影响
若try or catch中和finally中都有return时,finally中的return会覆盖前面的return
若try or catch 中的return执行时,会把return后的值进行暂存,并在执行完finally之后再进行返回
所以推荐不要再try中return数据
更多Java面试复习笔记和总结可访问我的面试复习专栏《Java面试复习笔记》,或者访问我另一篇博客《Java面试核心知识点汇总》查看目录和直达链接