异常

异常体系继承 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;
        }
    }
原文地址:https://www.cnblogs.com/AshOfTime/p/10500032.html