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

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

成都创新互联公司-专业网站定制、快速模板网站建设、高性价比克拉玛依网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式克拉玛依网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖克拉玛依地区。费用合理售后完善,十余年实体公司更值得信赖。

公司主营业务:成都网站制作、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出华州免费做网站回馈大家。

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的怀远网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

创新互联于2013年开始,是专业互联网技术服务公司,拥有项目做网站、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元乌鲁木齐做网站,已为上家服务,为乌鲁木齐各地企业和个人服务,联系电话:18980820575

新巴尔虎右ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了尼河口免费建站欢迎大家使用!

若有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

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;  

        }  

    }  

  

}  

第二种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;去掉就会抛出异常了!!!


当前文章:Java异常----try、catch和finally块中的return执行顺序
转载注明:http://pwwzsj.com/article/igchoj.html