前几天去面试,其中有两道面试题。如下
一:finally里的语句一定会执行吗?
二:有如下形式的语句
try{
return 5;
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("会执行嘛?");
}
这样的代码块放在一个方法里,finally里的语句还会执行吗?如果会是在return语句之前执行还是之后执行?
我当时知道finally里的语句是一定会执行的,可是如果按照代码的执行顺序似乎应该return语句先执行,可是一执行return语句这个方法就会结束,所以我答曰:finally里的语句在return之前执行。
回去之后做了一个测试
public class ReturnTest {
public static int testFinal(){
try{
return 5;
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("会执行嘛?");
}
return 0;
}
public static void main(String args[]){
System.out.println(testFinal());
}
}
最后输出:
会执行嘛?
5
这样可以发现finally里的语句是会先执行的
Debug后发现的情况是:先执行finally;在执行return 5;语句,最终没有执行return 0;因为return 5的时候方法已经结束了,可是没有return 0;这条语句会报错。该如何解释?不解啊
网上资料: http://topic.csdn.net/u/20090521/13/4465dec0-4c2e-4ed3-a93f-5b661cd8268b.html
参考一:
在 try 中 或 catch 中遇到 return 就会转入 finally |
参考二:
根据java规范:在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终 返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是 finally中的代码是必须要执行的,而且是在return前执行,除非碰到exit()。 |
分享到:
相关推荐
首先,需要了解的是,在 try-finally 或者 catch-finally 中,如果 try 或者 catch 中有 return 语句,则 finally 中的代码一定会执行,并且是在 return 前执行的。如果 finally 中也有 return 语句,那么finally 中...
finally: # finally语句块执行 print(98) print(fun()) # 输出:98ok print('----------') print(func()) # 输出:9898ok ``` 在这个例子中,`fun()`函数在遇到`return`后立即结束,所以`print(98)`后面的代码...
首先,需要了解的是finally语句块是否一定会执行的问题。很多人第一反应是肯定要执行的,但仔细一想,如果一定会执行的话,也就不会这么SB的问了。 事实上,finally语句块不一定会执行。只有与finally相对应的try...
无论哪种情况,`finally`块始终会在`try`和`catch`块之后执行。 **正常执行情况**: 1. `try`块中的代码成功执行,`res = 1`。 2. `System.out.println("try ……");`打印"try ……"。 3. `return res + 1;`返回2...
很多人都认为 finally 语句一定会被执行,但这是不正确的。在某些情况下,finally 语句可能不会被执行,例如在 try 语句之前就返回了,在 try 块中有 System.exit(0) 语句等。 那么,finally 语句是在 try 的 ...
首先,我们需要澄清一个常见的误解:`finally`语句块并不总是会执行。这个概念在某些特定情况下并不成立。举个例子,当`try`语句块在执行前就返回了(`return`语句)或抛出了异常,如果`try`块没有被执行,相应的`...
// 总是会执行的代码 } ``` `finally` 块的执行规则有以下几点需要注意: 1. **返回值**:如果 `finally` 块包含 `return` 语句,那么它将覆盖 `try` 或 `catch` 块中的任何 `return` 语句。这意味着最后的返回值...
finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...
2. finally 语句一定会执行么? finally 语句总是会执行的,除非 JVM 退出或 Thread 死亡。finally 语句主要用于释放资源和处理异常。 3. try-catch-finally 语句的执行顺序是如何的? try 语句执行 -> catch ...
4. `finally`块的执行并不意味着一定会等到所有其他代码执行完毕。例如,如果`try`或`catch`块中有一个`return`语句,`finally`块将在`return`之前执行,但不会阻止`return`语句的执行。 关于字节码层面的解释,...
1. **不可靠性**:无法保证 `finalize` 方法一定会被调用,因为 GC 的具体行为取决于 JVM 实现以及运行环境。 2. **效率低下**:`finalize` 方法的执行可能会延迟 GC 的完成时间,从而降低程序的运行效率。 3. *...
VB.NET 演示带Finally的Try Catch 异常处理用法...使用Finally的好处是,把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。
finally中的代码和try-catch中的代码冲突时,finally中的代码一定会被执行且会忽略try-catch中的代码。但是如果try-catch中有System.exit(0);(虚拟机退出语句),则不会去执行fianlly中的代码。
finally块可以用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常)。这使得finally块非常适合用于释放资源的情况,例如关闭数据库连接、文件流等。 在上面的代码示例中...
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。 (2)在try块中有System.exit(0);这样的语句,...
总结来说,C#中的Try-Catch语句确实会对程序性能产生一定影响,但这种影响通常很小,特别是在处理可能的错误和异常情况时,其带来的安全性提升远大于性能损失。在编写代码时,应根据具体情况权衡是否使用Try-Catch,...
finally块一定会执行吗? try用于捕获异常,catch处理异常,finally确保一段代码无论是否发生异常都会执行。通常,finally块会被执行,除非程序被系统退出或者JVM崩溃。 6. **IO流** - 什么是字符流和字节流?...
理解`finally`的关键在于,它提供了一种保证某些代码一定会被执行的机制,这对于资源管理尤为重要。在面试和笔试中,可能会遇到涉及`finally`使用的问题,例如: - 题1:`finally`块中的return语句会覆盖try-catch...
Java 异常处理操作实例小结 Java 异常处理是 Java 编程语言中的一种错误处理机制,用于捕获和处理运行时的...在 try 语句块中,可能出现异常,但是 finally 语句块将被执行,并打印出“这里一定会被执行!”的信息。