当前位置:首页 > 数码 > Finally中的代码必定会口头吗 (finally是什么意思)

Finally中的代码必定会口头吗 (finally是什么意思)

admin5个月前 (04-14)数码11

理论在面试中,只需是不懂句普通答案都能否认的,由于假设是确定和反常的,那面试官就没有必要再问了嘛,而当天这道题的答案也是合乎这个套路。

1、典型回答

反常运转的状况下,finally中的代码是必定会口头的,但是,假设遇到以下意外状况,那么finally中的代码就不会继续口头了:

程序在try块中遇到System.exit()方法,会立刻中断程序的口头,这时finally块中的代码不会被口头,例如以下代码:

publicclassFinallyExample{publicstaticvoidmn(String[]args){try{System.out.println("口头try代码.");System.exit(0);}finally{System.out.println("口头finally代码.");}}}

以上程序的口头结果如下:

在try快中遇到Runtime.getRuntime().halt()代码,强迫中断正在运转的JVM。与System.exit()方法不同,此方法不会触发JVM封锁序列。因此,当咱们调用halt方法时,都不会口头封锁钩子或终结器。实现代码如下:

publicclassFinallyExample{publicstaticvoidmain(String[]args){try{System.out.println("口头try代码.");Runtime.getRuntime().halt(0);}finally{System.out.println("口头finally代码.");}}}

以上程序的口头结果如下:

程序在try块中遇到有限循环或许出现死锁等状况时,程序或许无法反常跳出try块,此时finally块中的代码也不会被口头。

掉电疑问,程序还没有口头到finally就掉电了(停电了),那finally中的代码人造也不会口头。

JVM意外解体疑问造成程序不能继续口头,那么finally的代码也不会口头。

钩子方法解释

在编程中,钩子方法(HookMethod)是一种由父类提供的空或自动成功的方法,子类可以选用性地重写或裁减该方法,以成功特定的行为或定制化逻辑。钩子方法可以在父类中被调用,以提供一种可插拔的方式来影响父类的行为。钩子方法理论用于框架或模板方法设计形式中。框架提供一个骨架或模板,其中蕴含一些曾经成功的方法及预留的钩子方法。详细的子类可以经过重写钩子方法来拔出定制逻辑,从而影响父类方法的成功方式。

2、考点剖析

反常运转的状况下,finally中的代码是必定会口头的,但是,假设遇到System.exit()方法或Runtime.getRuntime().halt()方法,或许是try中出现了死循环、死锁,遇到了掉电、JVM解体等疑问,那么finally中的代码也是不会口头的。

3、常识裁减

System.exit()和Runtime.getRuntime().halt()都可以用于中断程序的口头,但它们之间有以下区别:

例如以下代码,经常使用exit()方法会口头JVM封锁钩子:

FinallyclassExitDemo{//注册分开钩子程序static{Runtime.getRuntime().addShutdownHook(newThread(()->{System.out.println("口头ShutdownHook方法");}));}publicstaticvoidmain(String[]args){try{System.out.println("口头try代码。");//经常使用System.exit()分开程序System.exit(0);}finally{System.out.println("口头finally代码。");}}}

以上程序的口头结果如下:

而halt()分开的方法,并不会口头JVM封锁钩子,示例代码如下:

classExitDemo{//注册分开钩子程序static{Runtime.getRuntime().addShutdownHook(newThread(()->{System.out.println("口头ShutdownHook方法");}));}publicstaticvoidmain(String[]args){try{System.out.println("口头try代码。");//经常使用Runtime.getRuntime().halt()分开程序Runtime.getRuntime().halt(0);}finally{System.out.println("口头finally代码。");}}}

以上程序的口头结果如下:

小结

反常运转的状况下,finally中的代码是必定会口头的,但是,假设遇到System.exit()方法或Runtime.getRuntime().halt()方法,或许是try中出现了死循环、死锁,遇到了掉电、JVM解体等疑问,finally中的代码是不会口头的。而exit()方法会口头JVM封锁钩子方法或终结器,但halt()方法并不会口头钩子方法或终结器。


Java中try{}里面有return,finally里的代码会不会执行,什么时候被执行?

会执行,在方法返回给调用者前执行,因为如果存在finally代码块,try中的return语句不会立马返回给调用者,而是记录下返回值待finally代码块执行完毕之后再返回;注意这几点:1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

PHP中try.catch与return的执行顺序,该怎么解决

问题1输出结果是1问题2输出结果是2finally中的语句是一定要执行的,这点是肯定的。 finally中的语句执行在try之后。 通常try是要和catch(不捕获异常try就没意义了)。 一般的用法是:try{1想要执行的代码}catch(Exceptione){2异常处理}finally{3最终执行的代码}1中代码没错执行的顺序就是1->31中代码有错执行的顺序是2->3finally中的代码和return是没关系的,你可以把return写在任何地方。 它只和try、catch有关。 假如你把问题一种finally的代码写成:finally{return++x;}那么结果就是2了。 finally一定会执行,且在try或catch之后执行。 不知道这么说能明白吗~~~不明白可以问,我再回答~~~

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Finally