猜猜下面java程序分别会有什么样的输出?
程序:
public class Test { public static void main(String[] args) { System.out.println("=============test1=================="); System.out.println(test1()); System.out.println("==============================="); System.out.println("=============test1_1=================="); System.out.println(test1_1()); System.out.println("==============================="); System.out.println("\n============test2==================="); System.out.println(test2()); System.out.println("==============================="); System.out.println("\n============test2_1==================="); System.out.println(test2_1()); System.out.println("==============================="); System.out.println("\n============test3==================="); System.out.println(test3()); System.out.println("==============================="); System.out.println("\n============test3_1==================="); System.out.println(test3_1()); System.out.println("==============================="); } public static String test1() { String a = "in try"; try { return a; } catch (Exception e) { } finally { a = "in finally"; System.out.println("do finally"); } return a; } public static String test1_1() { String a = "in try"; try { return a; } catch (Exception e) { } finally { a = "in finally"; System.out.println("do finally"); return a; } } public static int test2() { int a = 1; try { return a; } catch (Exception e) { } finally { a = 2; System.out.println("do finally"); } return a; } public static int test2_1() { int a = 1; try { return a; } catch (Exception e) { } finally { a = 2; System.out.println("do finally"); return a; } } public static Helper test3() { Helper a = new Helper(); a.a = 1; try { return a; } catch (Exception e) { } finally { a.a = 2; System.out.println("do finally"); } return a; } public static Helper test3_1() { Helper a = new Helper(); a.a = 1; try { return a; } catch (Exception e) { } finally { a.a = 2; System.out.println("do finally"); return a; } } static class Helper { int a; public String toString() { return String.valueOf(a); } } }
运行结果:
=============test1================== do finally in try =============================== =============test1_1================== do finally in finally =============================== ============test2=================== do finally 1 =============================== ============test2_1=================== do finally 2 =============================== ============test3=================== do finally 2 =============================== ============test3_1=================== do finally 2 ===============================
结论:
1.在try catch块里return的时候,finally也会被执行。
2.return语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果return 的是引用类型的,改动将可以起效果。
3.finally里的return语句会把try catch块里的return语句效果给覆盖掉。
看来return语句并不一定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去了。看来最佳实践是:
1.最好把return放到方法尾而不要在try cath 里return
2.不要在try catch块和finally块里都包含return
3.如果在try catch块里return, 则不要在finally块里操作被return的变量
相关推荐
当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据结构中。然后,解释器跳转到`finally`块,执行其中的代码。即使在`finally`块中有`return`,原始的`return`语句的返回值也不会...
try、catch、finally、return 执行顺序详细讲解 try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...
2. **`return` 与 `finally` 的执行顺序**:在 `try` 块中遇到 `return` 时,会先执行 `finally` 语句块,然后再返回值。这是因为 `finally` 中的代码优先级高于 `return`,即使 `return` 已经被触发,`finally` ...
在Java编程语言中,异常处理机制是...当两者同时存在时,`finally`块的代码总是先执行,但最终的返回值由最后遇到的`return`语句决定。在编写代码时,理解这种行为可以帮助避免意外的程序行为,并确保程序的健壮性。
当程序运行过程中遇到错误或异常情况时,如果没有妥善处理,可能会导致程序崩溃。Java、C#等许多编程语言提供了异常处理框架,其中“try-catch-finally”是常用的一种结构。下面我们将详细探讨这个主题。 1. **异常...
这些指令确保即使遇到异常或正常退出,也能正确地执行`__finally`块中的代码。 #### 四、示例解析 假设有一个简单的示例,其中使用了终止处理程序来避免内存泄漏: ```cpp char *p = NULL; __try { p = new char...
首先,`finally`块不会被跳过,除非遇到以下两种极端情况: 1. 程序通过`System.exit()`退出。 2. 由于硬件故障或操作系统干预导致进程被终止。 在正常情况下,`finally`块的执行遵循以下规则: 1. 当`try`块执行...
然而,这个规则并不总是绝对的,特别是当`return`语句处于`try/except/finally`异常处理结构中时。 1. **默认返回值**:如果一个函数没有显式地包含`return`语句,或者`return`后面没有跟任何表达式,那么函数将...
总的来说,`try-catch-finally`结构提供了一种强大的错误处理方式,确保了程序在遇到异常时能够继续执行关键的清理任务,并且控制返回值。理解这个执行顺序对于编写健壮的代码至关重要,特别是在处理资源管理和异常...
2. 如果遇到`return`语句,会创建一个临时变量,保存`return`语句要返回的值。 3. `finally`块被执行。 4. `finally`块执行完毕后,临时变量的值被返回。 这个规则解释了为何示例代码的输出是0,而不是1,同时也...
在 `except` 中的 `return` 遇到 `finally` 时,`finally` 会被执行,然后返回 `finally` 中的值。 2. **test2()**: 在这个例子中,`try` 块没有引发异常,但 `return` 语句仍然导致 `finally` 的执行。同样,`...
当`try` 块内的代码执行过程中遇到异常时,程序将跳过该异常发生后`try` 块内剩余的代码,并进入`catch` 块进行处理。如果`try` 块内没有异常发生,那么程序将按照正常流程执行完`try` 块内的所有代码。 #### 三、...
总的来说,`try-catch-finally`语句是C#中进行错误处理的核心工具,它使得程序在遇到异常时能够继续执行,而不是直接崩溃,从而提高了程序的健壮性和可靠性。通过熟练掌握这一机制,开发者可以编写出更加稳定且易于...
33. **try-finally的执行顺序**:finally中的代码总会在return之前执行。 34. **计算2乘以8**:最简单的方法是`int result = 2 * 8`。 35. **相同的对象,不同的hash code**:错误,对象相等时,hash code应相同。 ...
`try...catch...finally`块中,如果在`try`块中遇到`return`语句,`finally`块会先执行,然后才会执行`return`。所以,代码会打印"Finally",然后返回,不会执行`finally`块后面的语句。因此,正确答案是B。 4. ...
当程序执行过程中遇到异常,会生成一个异常类的对象并抛出。如果这个异常没有被当前方法处理,它会向上层调用者传递,直到找到能够捕获并处理它的代码块,或者到达main()方法。如果main()也不处理,程序就会终止。 ...
异常处理通过`try-catch-finally`块来实现,用于捕获和处理异常,确保程序在遇到错误时仍能保持一定程度的稳定性和可预测性。 首先,`try`块用于包含可能抛出异常的代码。如果在`try`块内发生了异常,控制权将立即...
这个例子展示了异常处理的复杂性,特别是当多个嵌套的 `try-catch-finally` 结构存在时。在编写代码时,我们需要谨慎处理异常的传播和处理,确保所有可能抛出异常的代码都包含在 `try` 块中,并适当地捕获和处理异常...
Java中的异常处理是编程实践中必不可少的一部分,它确保了程序在遇到错误或异常情况时能够优雅地处理并继续执行,或者至少提供有用的错误信息。异常处理的主要目的是提高程序的健壮性和稳定性。 1. 为什么需要异常...
例如,当遇到`break MISSING_BLOCK_LABEL_45;`这样的语句时,它可能表示一个未定义的标签,需要根据上下文找到合适的跳转位置,修复控制流。 处理这些问题的关键是理解原始代码的逻辑,并根据反编译后的代码结构...