zoukankan      html  css  js  c++  java
  • 异常

    异常体系继承 Error Exception区别 Throw与Throws final关键字 受查异常与非受查异常

    1、异常的理解与分类

      异常是方法调用非正常返回的一种方式,return是方法调用正常的返回方式。

      当jvm执行字节码发现“问题”的时候,首先创建一个根据“问题”的具体类型创建一个异常对象,并在代码里寻找是否有能处理该异常的机制,如果没有就会启动默认异常处理机制。所谓默认异常处理机制指的是打印异常栈信息并退出方法的执行。

      所有的异常都继承自Throwalbe,只有继承自 Throwalbe的对象才能被抛出(Throw)和捕获(catch)。Error代表资源耗尽、系统异常错误,应用程序不用抛出或者处理这类错误,因为这类错误其实没法处理。Exception是程序运行中可用捕获可以预料到的异常,并且应该进行相应的处理。

      Exception分为受查异常和非受查异常,受查与不受查是针对编译器而言的,受查异常需要在源代码里显示的处理如try包裹或者throws出去,如果没有这部分代码那么无法通过编译,非受查异常就没有这种强制性的要求。

    2、异常处理

      使用try/catch语句把有可能发生异常的代码包裹起来并按顺序在catch里声明捕获异常的类型与处理异常的代码。异常的寻找是按照从上到下的顺序寻找,如果找到第一个符合要求的就不继续往下寻找catch语句,是否符合要求的标准是抛出的异常的类型和catch里声明的异常类型是否匹配,注意多态性在匹配过程中的应用,把范围较大的异常放到catch语句的下面。

      在捕获到异常后有两种处理,一种是直接在catch里处理异常如打印异常信息,一种是使用throw继续抛出异常。有一个和它长得很像的关键字throws,最直观的区别是throws关键字写在方法声明部分,用于标志方法有可能抛出异常且没有完全处理的异常,要求调用者必须处理throws的异常。如果用throw抛出了一个异常那么意味着该方法有一个没有处理完成的异常,那么在该方法声明部分就要加上thorws关键字。

    3、finally

      finally代表有无异常发生finally里的东西一定会被执行,多用于资源释放。

      但是finally不能修改return的返回值,下面代码返回0。

    public static int ex(){
           int ret = 0;
           try {
               return ret;
           }finally {
               ret = 2;
           }
        }

      如果返回是一个引用类型,return不能修改该引用类型具体指向的对象,但是可以修改该对象的内容。下面的代码输出是777,因为在return里增加了这个数字。但是如果在finally把list指向lst2这个修改是无效的。

      public static ArrayList ex(){
            ArrayList<Object> list1 = new ArrayList<>();
            ArrayList<Object> list2 = new ArrayList<>();
            list1.add(1);
            list2.add(2);
    
            ArrayList<Object> list = new ArrayList<>();
            list = list1;
    
    
    
            try {
               return list;
           }finally {
               list.add(77);
           }
        }
    
        public static void main(String[] args) {
            System.out.println(ex().get(1));
        }

      当然某些丧心病狂的笔试题会提出如果try return里都有返回会怎么办,实际返回的是finally里的返回值。

    public static int testReturn(){
            try {
                return 0;
            }finally {
                return 1;
            }
        }

       这种机制在我看来没有任何意义,不仅让人读着别扭而且会掩盖catch里的异常。在try里加上除零操作也会正常返回1。

     public static int testReturn(){
            try {
                int j = 5/0;
                return 0;
            }finally {
                return 1;
            }
        }
  • 相关阅读:
    【线段树合并】联通分量计数
    莫队算法
    Ubuntu实用软件安装[转]
    装系统·折腾记
    Qt环境配置 + Qt使用教程
    Google题解
    隐含马尔科夫模型
    Pythonの坑
    C++11并发编程个人小结
    微软2017年预科生计划在线编程笔试
  • 原文地址:https://www.cnblogs.com/AshOfTime/p/10500032.html
Copyright © 2011-2022 走看看