1:异常的理解
假如开车上山:车坏了,你自己修复好了,继续上山;(Exception被捕获,程序继续执行)
假如开车上山:车坏了,你不知道怎么处理,这个时候打电话给修车行,并且详细描述你的问题;
(Exception被抛出到上层处理,最好是捕获特定异常进行抛出)
假如开车上山:山体坍塌了(Error:运行环境不正常)
异常捕获的定义:我自己处理
异常抛出的定义:让上层处理 而上层也可以自己处理或者继续往上层的上层抛
而最上层则是抛给JVM处理(报错)
2:Throwable Exception Error的设计与分类
Error:是导致JVM自身处于非正常、不可恢复状态。
Exception:
可检查(checked)异常 : 在代码编写的时候Idea会进行提示
如IOExcetipon 可检查异常必须在源代码里面进行捕获或者往外抛
不检查(unchecked)异常:在代码编写的时候Idea会不进行提示 运行期才会进行显示 因此也叫做运行期异常
如NullPointerException
3:关于异常的捕获或者抛出的选择
怎么定义代码逻辑是否重要:
假如某段逻辑是可以忽略的,可以让后面的逻辑继续走下去;
则说明不重要该逻辑不重要;
假如某段逻辑是不可忽略的,让后面的逻辑继续走下去也只是会导致更多的业务问题;
则说明不重要该逻辑是重要的;
1:对于不重要但可能报错的的代码逻辑 可以try起来
在catch的时候打印使用 log.info("XXX异常{}"+e.message,e) 然后不进行抛出 让后面的代码逻辑继续往下走
public void sleepTest() throws InterruptedException {
System.out.println("开始睡眠");
try {
Thread.sleep(5000L);
}catch (InterruptedException e) {
log.info("XXX异常{}"+e.message,e)
}
System.out.println("结束睡眠");
}
2:对于重要而且可能报错的的代码逻辑 需要把异常抛出去
public void sleepTest() throws InterruptedException {
System.out.println("开始睡眠");
Thread.sleep(5000L);
System.out.println("结束睡眠");
}
3:既要打印错误日志又要抛出异常
public void sleepTest() throws InterruptedException {
System.out.println("开始睡眠");
try {
Thread.sleep(5000L);
}catch (InterruptedException e) {
log.info("XXX异常{}"+e.message,e)
throw new InterruptedException()
}
System.out.println("结束睡眠");
}
4:异常扩展
使用异常时的注意事项:
1:尽量不要捕获类似Exception这样的通用异常,而应该捕获特定异常;
2:不允许使用e.printStackTrace();
printStackTrace的定义
java运行时系统会自动将catch括号中的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异常。
网友评论