java 中的各种奇怪的执行顺序之异常篇

try{
statement1;
} 
catch(ExceptionType1 e1){
  statement2;
} catch(ExceptionType2 e2){

statement3;

}finally{
statement4;
}

情况讨论:

  • 1,statement1 抛出异常e,如果e是e1类型或子类型,那么就会进入 statement2,不会进入 statement3,如果 statement2 含return,那么会先进入finally,再执行return(如果statement4中含return,那么只会执行这个return);

测试代码:


    public static String test001(int a) {
        try {
          if(a==1){
              throw new Exception();
          }
            return "try block";

        } catch (Exception e) {

            System.out.println(" catch block");
            return "catch return";
        } finally {
            System.out.println(" finally block");
            return " finally return";
        }
    }
 public static void main(String[] args) {
        System.out.println("main:"+test001(1));
        }

输出:
在这里插入图片描述

  1. 未抛出异常,如果statement1 有return,那么先进入finally再进入statement1的return (如果finally 有return 那么只能进入finally的return)
    测试代码:
public class TryCatch {
    public static void main(String[] args) {
        System.out.println("main:" + test002());
    }

    public static String test002() {
        try {

            return "try block";

        } catch (Exception e) {

            System.out.println(" catch block");
        } finally {
            System.out.println(" finally block");
//            return " finally return";
        }

        return "result";
    }
}

效果:finally不含return
在这里插入图片描述finally 含return:

在这里插入图片描述

总结

  • try 通常与catch连用,但是并不一定需要与catch连用
    可以是try{}finally{}
  • try {}catch(){ExceptionType1 e1}catch(ExceptionType e2){},如果抛出的异常不是ExceptionType1类型或者其子类型,那么就交给下一个catch处理(继续判断类型)
  • return 只会执行一次.如果finally有return,那么只会执行这个return
  • finally 中没有return,try 或者catch有return,那么需要先执行try,catch,然后finally,最后执行对应的return

版权声明:本文为qq_36922927原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。