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
}

分析

  1. 尽量不要捕获Exception这种通用异常,应该捕获特定的异常,以提高代码可读性
  2. 不要生吞异常,如果不抛出来或者不输出到日志,程序出错后很难判断异常在哪里抛出,以及是什么原因抛出

案例二

try {
	// 业务代码
	// …
} catch (IOException e) {
	e.printStackTrace();
}

分析

printStackTrace输出的内容在控制台可以看见,但是在分布式的生产环境下,如果发生异常,无法找到输出位置,最好是将异常输出到日志系统中去。

finally相关考点

finally不会被执行的情况

  1. try-cach 异常退出。
	try{
		system.exit(1)
	}finally{
		print(abc)
	}
  1. 无限循环
	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面试核心知识点汇总》查看目录和直达链接