美文网首页
Exception和Error的区别?

Exception和Error的区别?

作者: _River_ | 来源:发表于2021-05-18 13:57 被阅读0次
    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的区别?

          本文链接:https://www.haomeiwen.com/subject/dfoejltx.html