Exception和Error的区别?

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异常。

你可能感兴趣的:(Exception和Error的区别?)