温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java异常----try、catch和finally块中的return执行顺序

发布时间:2020-07-09 17:39:46 来源:网络 阅读:324 作者:沙漏半杯 栏目:编程语言

1.当Java程序执行try块、catch块时遇到return语句,return语句会导致该方法立即结束。系统执行完return语句之后,并不会立即结束该方法,而是去寻找该异常处理流程中是否包含finally块,若没有finally块,则方法终止,返回相应的返回值;


若有finally块,则立即开始执行finally块,此时若finally块中没有return语句,则系统才会再次跳回来根据try块或catch块中的return语句结束方法(但是,不会再次执行return语句体,还是第一次执行的那个结果);若finally块中有return语句,则finally块已经结束了方法,系统不会跳回去执行try块或catch块里的任何代码。


没有finally块的比较简单,这里只看有finally块的,看如下代码:


[java] view plaincopy


package com.mys.test;  

  

public class Test {  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        Test test = new Test();  

        int a = 0;  

        try {  

            a = test.test();  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        System.out.println("调用test()后a="+a);  

          

    }  

  

    @SuppressWarnings("finally")  

    private int test()throws Exception {  

        int count = 5;  

        try{  

            System.out.println("try块,count="+count);  

            return ++count;//main()中输出6  

//          return count++;//main()中输出5  

        }finally{  

            count=100000;  

            System.out.println("finally块,count++="+count++ +"  ,count="+count);  

        }  

    }  

  

}  

第一种finally块中没有return语句,则上面代码输入如下:

try块,count=5

finally块,count++=100000  ,count=100001

调用test()后a=6


其中调用test()后a=6就说明了执行完finally块后代码虽然立刻返回了,但不会再次执行try或catch块中的return语句体,还是第一次执行的那个结果(由局部变量决定的)


[java] view plaincopy


<span >package com.mys.test;  

  

public class Test {  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        Test test = new Test();  

        int a = 0;  

        try {  

            a = test.test();  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        System.out.println("调用test()后a="+a);  

          

    }  

  

    @SuppressWarnings("finally")  

    private int test()throws Exception {  

        int count = 5;  

        try{  

            System.out.println("try块,count="+count);  

            return ++count;  

        }finally{  

            count=100000;  

            System.out.println("finally块,count++="+count++ +"  ,count="+count);  

            return ++count;  

        }  

    }  

  

}</span>  

第二种finally块中有return语句,则上面代码输入如下:

try块,count=5

finally块,count++=100000  ,count=100001

调用test()后a=100002




2.再来看另一种情况,


[java] view plaincopy


package com.mys.test;  

  

public class Test {  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        Test test = new Test();  

        int a = 0;  

        try {  

            a = test.test();  

        } catch (Exception e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        System.out.println("调用test()后a="+a);  

          

    }  

  

    @SuppressWarnings("finally")  

    private int test(){  

        int count = 5;  

        try{  

            System.out.println("try块,count="+count);  

            throw new RuntimeException("测试异常");  

        }finally{  

            count=100000;  

            System.out.println("finally块,count++="+count++ +"  ,count="+count);  

            return ++count;  

        }  

    }  

  

}  

上面代码输入如下:

try块,count=5

finally块,count++=100000  ,count=100001

调用test()后a=100002

try块中抛出了RuntimeException异常,同时程序中并未使用catch块来捕获这个异常,正常情况下,该异常应导致test()方法非正常终止,test()应该没有返回值。但实际情况是,test()完全可以正常结束.这也符合finally块执行的流程:


当程序执行try块、catch块时遇到throw语句,throw语句会导致该方法立即结束。系统执行完throw语句之后,并不会立即结束该方法,而是去寻找该异常处理流程中是否包含finally块,若没有finally块,则程序立即抛出异常;


若有finally块,则立即开始执行finally块,此时若finally块中没有return语句,则系统才会再次跳回来抛出异常;若finally块中有return语句,则finally块已经结束了方法,系统不会跳回去执行try块或catch块去抛出异常。


由于上面的例子是使用的RuntimeException异常,该异常属于非受查异常,编译器不要求强制处置的异常

(强制处理的需要用try...catch...或者往上抛出(test() throws Exception),所以,能够正常输出.


即没有异常,如果,把 上例中finally块中的return ++count;去掉就会抛出异常了!!!


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI