第2讲:Exception和Error的区别?
假如开车上山:车坏了,你自己修复好了,继续上山;(Exception被捕获,程序继续执行)
假如开车上山:车坏了,你不知道怎么处理,这个时候打电话给修车行,并且详细描述你的问题;
(Exception被抛出到上层处理,最好是捕获特定异常进行抛出)
假如开车上山:山体坍塌了(Error:运行环境不正常)
Throwable Exception Error的设计与分类


Error:是导致JVM自身处于非正常、不可恢复状态。
Exception:分为可检查(checked)异常和不检查(unchecked)异常
可检查异常必须在源代码里面进行捕获
使用异常时的注意事项:
1:尽量不要捕获类似Exception这样的通用异常,而应该捕获特定异常;
2:不允许使用e.printStackTrace();
printStackTrace的定义
java运行时系统会自动将ducatch括号中的Exception e的初始化,也就是实例化Exception类型的对象,同时e是此对象引用名称。
然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;
printStackTrace的翻译:
在命令行(程序控制台)打印异常信息在程序中出错的位置及原因,因此非调试情况下不知道在哪里
实例化Exception的损耗:
异常实例的构造十分昂贵。这是由于在构造异常实例时,Java 虚拟机便需要生成该异常的栈轨迹(stack trace)。
该操作会逐一访问当前线程的 Java 栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常。
NoClassDefFoundError与ClassNotFoundException的区别
NoClassDefFoundError产生的原因在于(常见于打包时把某些jar包漏掉了):
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。
要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError.
ClassNotFoundException的产生原因主要是(常见于类名错误):
Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态地加载类时,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,
如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
网友评论