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://myzitong.com/article/igchoj.html