打不开二十一点网页二级页面打不开时怎么处理

求助:finally与return到底谁先执行?_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:608,218贴子:
求助:finally与return到底谁先执行?收藏
java培训---美国上市公司出品,入学签订就业协议,名企疯抢达内学员.java,O基础小班授课,java专家领衔授课,免费试听,满意后付款!
不是说先执行完finally再返回的吗?为什么结果是0
我猜是 它读到return res的时候 已经把res=0记住了 等读到finaly的时候加也没有用了 你试一下在finaly写个输出语句res看看是不是1
只要站起来的次数比倒下去的次数多,那就是成功。
执行后返回前执行
你的代码不是先return还是先finaly的问题,而是先try,try里面是return肯定会执行啊,我想你问的是return在 try外面先执行return还是finaly吧
先返回结果,在执行自加
java海同强大的师资阵容,因人制定课程内容,分阶段学习.java就到正规Java培训机构-海同科技,培训Java面对面教学,免费重读!
执行return的时候是 copy了res的值,但没真正返回; 所以finally 里无论怎么操作 都不影响之前copy的值,finally执行完,真正的return。 你可以返回个引用类型,但不要用String,返回的结果应该是finally 修过的, 因为执行return copy了引用的地址值。
当一个方法执行到return语句的时候就准备弹栈了,返回通道已经建立,会返回的数据被确定,如果此方法有finally语句,则执行该语句块,然后return执行完方法弹栈
return然后没了
javap你值得使用
debug,显示return-fanally-return
finally限制性,return后执行
finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。注意:如果没有catch语句块,那么finally块就是必须的。
顺序是 先执行return 但是 这时候程序不返回 接着执行完finally
执行完后 把return 语句返回的值输出 所以 这解释了为啥是9
FinAlly是在return执行后,但是还没有返回时执行
返回0这个程序,有兴趣的话加我扣扣给你详解
先返回后加。
先走return 0,方法结束。但是final是必须执行。所以方法结束也得加一。
毕老师讲的是,除非之前用system.exit(0)退出jvm,finally语句才不会执行的,
先return,结果压栈,再执行finally
先return,把值压栈,在执行finally,你可以在finally和return前面各里面加个输出语句就知道了
先执行catch中return之前的,再执行finally,再执行catch的return
第一次遇到return时已经建立了返回通道这时,返回值已经确定是0,然后执行finally语句res=1,最后执行完return语句等于0
@Testpublic void test02() {int i=0;try {} finally {System.out.println(++i);//输出为1}}
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或2009年11月 Java大版内专家分月排行榜第三
2010年5月 Java大版内专家分月排行榜第一2010年2月 Java大版内专家分月排行榜第一2010年1月 Java大版内专家分月排行榜第一2010年1月 Oracle大版内专家分月排行榜第一2009年12月 Java大版内专家分月排行榜第一2009年12月 Oracle大版内专家分月排行榜第一
2010年2月 Oracle大版内专家分月排行榜第三
2010年2月 Java大版内专家分月排行榜第二
2011年7月 Java大版内专家分月排行榜第三2010年1月 Java大版内专家分月排行榜第三2009年12月 Java大版内专家分月排行榜第三
2008年10月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。2473人阅读
Java编程(25)
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
当然还有很多人探讨Finally语句的执行与return的关系,颇为让人迷惑,不知道finally语句是在try的return之前执行还是之后执行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:finally语句是在try的return语句执行之后,return返回之前执行。这样的说法有点矛盾,也许是我表述不太清楚,下面我给出自己试验的一些结果和示例进行佐证,有什么问题欢迎大家提出来。
1. finally语句在return语句执行之后return返回之前执行的。
public class FinallyTest1 {
public static void main(String[] args) {
System.out.println(test1());
public static int test1() {
int b = 20;
System.out.println(&try block&);
return b += 80;
catch (Exception e) {
System.out.println(&catch block&);
System.out.println(&finally block&);
if (b & 25) {
System.out.println(&b&25, b = & + b);
运行结果是:
finally block
b&25, b = 100
100说明return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果。
如果觉得这个例子还不足以说明这个情况的话,下面再加个例子加强证明结论:
public class FinallyTest1 {
public static void main(String[] args) {
System.out.println(test11());
public static String test11() {
System.out.println(&try block&);
return test12();
} finally {
System.out.println(&finally block&);
public static String test12() {
System.out.println(&return statement&);
return &after return&;
}运行结果为:
return statement
finally block
after return
说明try中的return语句先执行了但并没有立即返回,等到finally执行结束后再
这里大家可能会想:如果finally里也有return语句,那么是不是就直接返回了,try中的return就不能返回了?看下面。
2. finally块中的return语句会覆盖try块中的return返回。
public class FinallyTest2 {
public static void main(String[] args) {
System.out.println(test2());
public static int test2() {
int b = 20;
System.out.println(&try block&);
return b += 80;
} catch (Exception e) {
System.out.println(&catch block&);
} finally {
System.out.println(&finally block&);
if (b & 25) {
System.out.println(&b&25, b = & + b);
return 200;
运行结果是:
finally block
b&25, b = 100
这说明finally里的return直接返回了,就不管try中是否还有返回语句,这里还有个小细节需要注意,finally里加上return过后,finally外面的return b就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。
这里大家可能又想:如果finally里没有return语句,但修改了b的值,那么try中return返回的是修改后的值还是原值?看下面。
3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值就不会因为finally里的修改而改变。
public class FinallyTest3 {
public static void main(String[] args) {
System.out.println(test3());
public static int test3() {
int b = 20;
System.out.println(&try block&);
return b += 80;
} catch (Exception e) {
System.out.println(&catch block&);
} finally {
System.out.println(&finally block&);
if (b & 25) {
System.out.println(&b&25, b = & + b);
return 2000;
运行结果是:
finally block
b&25, b = 100
100finally里的b = 150;并没有起到作用,这貌似是前面说的有些矛盾,因为前面说try中的return是在finally执行完了才返回的,这里我的解释是:因为try中的return语句已经执行完了只是还没有返回,但是它的返回值已经确定下来了(这里是100),已经跟b这个变量无关了,不会再根据b的值决定返回什么,所以finally里对b的修改只影响b的值对原来已脱离b影响的返回值没有一点影响。这同时也说明了返回语句是try中的return语句而不是finally外面的return
这句,不相信的话可以试下,将改为return 294,对原来的结果没有一点影响。
这里大家可能又要想:是不是每次返回的一定是try中的return语句呢?那么finally外的return b不是一点作用没吗?请看下面。
4. try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。
public class FinallyTest4 {
public static void main(String[] args) {
System.out.println(test4());
public static int test4() {
int b = 20;
System.out.println(&try block&);
b = b / 0;
return b += 80;
} catch (Exception e) {
System.out.println(&catch block&);
} finally {
System.out.println(&finally block&);
if (b & 25) {
System.out.println(&b&25, b = & + b);
return 204;
}运行结果是:
catch block
finally block
b&25, b = 35
这里因为在return之前发生了除0异常,所以try中的return不会被执行到,而是接着执行捕获异常的catch语句和最终的finally语句,此时两者对b的修改都影响了最终的返回值,这时就起到作用了。当然如果你这里将return b改为return 300什么的,最后返回的就是300,这毋庸置疑。
这里大家可能又有疑问:如果catch中有return语句呢?当然只有在异常的情况下才有可能会执行,那么是在finally之前就返回吗?看下面。
5. 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样。
public class FinallyTest5 {
public static void main(String[] args) {
System.out.println(test5());
public static int test5() {
int b = 20;
System.out.println(&try block&);
return b += 80;
} catch (Exception e) {
System.out.println(&catch block&);
return b += 15;
} finally {
System.out.println(&finally block&);
if (b & 25) {
System.out.println(&b&25, b = & + b);
运行结果如下:
catch block
finally block
b&25, b = 35
说明了发生异常后,catch中的return语句先执行,确定了返回值后再去执行finally块,执行完了catch再返回,finally里对b的改变对返回值无影响,原因同前面一样,也就是说情况与try中的return语句执行完全一样。
最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句不能影响try或catch中return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
微信学习公众平台-媛媛推荐
微信号:programer-idea
名称:程序媛想事儿
功能介绍:媛媛的主题包括技术蛋糕(包括IT最新资讯、C/C++/Java等编程语言知识及有关算法探讨等IT资料)、生活指南、轻松一刻三个栏目,每天会推送这三个方面的信息给大家,让猿媛们在学习IT知识的同时能关注生活关注健康,同时还能轻松开怀一笑。同时,大家可以回复关键词定制自己想要的信息,如只看C/C++相关资料、只看Java相关资料、只看生活指南或只想开怀一笑都是可以的,后期会根据需要开设疑难解惑等其它平台,欢迎大家加入学习!!!
作者:Alexia(minmin)
CSDN:http://blog.csdn.net/lanxuezaipiao
博客园:/lanxuezaipiao/
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
否则保留追究法律责任的权利
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
以前的博客,虽已不再更新,但某些文章也值得参考滴:
生活、读书、感悟等非技术性文章,请移步至我的简书博客:
收藏了很多读书和电影条目,基本上都有自己的评鉴语:
微信学习公众平台-媛媛推荐
微信号:programer-idea
名称:程序媛想事儿
访问:653912次
积分:9337
积分:9337
排名:第1691名
原创:123篇
转载:14篇
评论:1063条
阅读:60752
文章:16篇
阅读:91097
阅读:38621
(1)(1)(1)(2)(3)(9)(5)(17)(4)(8)(4)(4)(5)(1)(7)(4)(22)(14)(10)(5)(11)(2)(1)java Finally代码块真的任何情况下都是执行的?_ASP.NET技巧_动态网站制作指南
java Finally代码块真的任何情况下都是执行的?
来源:人气:31
三种可能不执行finally代码块的情况
- 在try代码块之外产生异常或者返回下是不会执行finally代码块的
- 执行try代码块时候退出了JVM虚拟机
- 在子线程执行try代码块或者catch代码块时候突然关闭了线程,也可能不执行finally代码块
- 突然断电了也可能
public class Test {
public static void main(String[] args) throws InterruptedException {
// 强制在try块中退出JVM也不会执行finally代码块,代码执行结果是不执行finally代码块
// System.out.intln("return value of test(): " + testExit());
// 在try代码块之前返回或者抛异常都是不会执行finally代码块,执行结果是不执行finally代码块
// System.out.println("return value of test(): " + test());
// 子线程执行try代码块时候突然关闭线程了,也可能不会执行finally代码块,我的试验情况是会指定,但是不会保证一定执行。
myThread thread = testThread();
thread.start();
Thread.sleep(1000);
thread.isRunning =
System.out.println("main exit");
static class myThread extends Thread {
public boolean isRunning =
public void run() {
super.run();
System.out.println(Thread.currentThread().getName() + "\t begin running");
while (isRunning) {
System.out.println("running");
// int i = 11 / 0;
if (isRunning == false) {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "\t exit running");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.out.println("子线程");
public static myThread testThread() {
return new myThread();
* 测试在try块中退出JVM
public static int testExit() {
int i = 1;
System.out.println("try block");
System.exit(0);
} finally {
System.out.println("finally block");
* 测试在try块之外抛异常或者返回
public static int test() {
int i = 1;
// if (i == 1)
// return 0;
System.out.println("the previous statement of try block");
i = i / 0;
System.out.println("try block");
} finally {
System.out.println("finally block");
关于finally代码块一定会执行的情况:
只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。不管 try 语句块正常结束还是异常结束,finally 语句块是保证要执行的。
如果 try 语句块正常结束,那么在 try 语句块中的语句都执行完之后,再执行 finally 语句块。如果 try 中有控制转移语句(return、break、continue)呢?那 finally 语句块是在try语句块中return控制转移语句之前执行;
如果 try 语句块异常结束,应该先去相应的 catch 块做异常处理,然后执行 finally 语句块。同样的问题,如果 catch 语句块中包含控制转移语句呢? finally 语句块是在这些控制转移语句之前,还是之后执行呢?我们给出实例代码。
代码执行结果 说明了 finally 语句块在 catch 语句块中的 return 语句之前执行
public class Test {
public static void main(String[] args) {
System.out.println("reture value of test() : " + test());
public static int test(){
int i = 1;
System.out.println("try block");
i = 1 / 0;
}catch (Exception e){
System.out.println("exception block");
}finally {
System.out.println("finally block");
综上 finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。虽然 return、throw、break 和 continue 都是控制转移语句,但是它们之间是有区别的。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移。请大家先记住它们的区别。
参考文章:
优质网站模板

我要回帖

更多关于 12306购票页面打不开 的文章

 

随机推荐