`

当return遇到finally

阅读更多

        猜猜下面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的变量

 

文章来源:http://sulong.me/2007/12/24/return_in_finally

分享到:
评论

相关推荐

    Java finally语句到底是在return之前还是之后执行?

    当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据结构中。然后,解释器跳转到`finally`块,执行其中的代码。即使在`finally`块中有`return`,原始的`return`语句的返回值也不会...

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序详细讲解 try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...

    浅谈Java中return和finally的问题

    2. **`return` 与 `finally` 的执行顺序**:在 `try` 块中遇到 `return` 时,会先执行 `finally` 语句块,然后再返回值。这是因为 `finally` 中的代码优先级高于 `return`,即使 `return` 已经被触发,`finally` ...

    Java异常处理中同时有finally和return语句的执行问题

    在Java编程语言中,异常处理机制是...当两者同时存在时,`finally`块的代码总是先执行,但最终的返回值由最后遇到的`return`语句决定。在编写代码时,理解这种行为可以帮助避免意外的程序行为,并确保程序的健壮性。

    使用try-catch-finally处理异常

    当程序运行过程中遇到错误或异常情况时,如果没有妥善处理,可能会导致程序崩溃。Java、C#等许多编程语言提供了异常处理框架,其中“try-catch-finally”是常用的一种结构。下面我们将详细探讨这个主题。 1. **异常...

    finally分析

    这些指令确保即使遇到异常或正常退出,也能正确地执行`__finally`块中的代码。 #### 四、示例解析 假设有一个简单的示例,其中使用了终止处理程序来避免内存泄漏: ```cpp char *p = NULL; __try { p = new char...

    java finally块执行时机全面分析

    首先,`finally`块不会被跳过,除非遇到以下两种极端情况: 1. 程序通过`System.exit()`退出。 2. 由于硬件故障或操作系统干预导致进程被终止。 在正常情况下,`finally`块的执行遵循以下规则: 1. 当`try`块执行...

    python函数中return后的语句一定不会执行吗?

    然而,这个规则并不总是绝对的,特别是当`return`语句处于`try/except/finally`异常处理结构中时。 1. **默认返回值**:如果一个函数没有显式地包含`return`语句,或者`return`后面没有跟任何表达式,那么函数将...

    try catch finally的执行顺序深入分析

    总的来说,`try-catch-finally`结构提供了一种强大的错误处理方式,确保了程序在遇到异常时能够继续执行关键的清理任务,并且控制返回值。理解这个执行顺序对于编写健壮的代码至关重要,特别是在处理资源管理和异常...

    java面试题之try中含return语句时代码的执行顺序详解

    2. 如果遇到`return`语句,会创建一个临时变量,保存`return`语句要返回的值。 3. `finally`块被执行。 4. `finally`块执行完毕后,临时变量的值被返回。 这个规则解释了为何示例代码的输出是0,而不是1,同时也...

    对python中的try、except、finally 执行顺序详解

    在 `except` 中的 `return` 遇到 `finally` 时,`finally` 会被执行,然后返回 `finally` 中的值。 2. **test2()**: 在这个例子中,`try` 块没有引发异常,但 `return` 语句仍然导致 `finally` 的执行。同样,`...

    trycatchfinaly

    当`try` 块内的代码执行过程中遇到异常时,程序将跳过该异常发生后`try` 块内剩余的代码,并进入`catch` 块进行处理。如果`try` 块内没有异常发生,那么程序将按照正常流程执行完`try` 块内的所有代码。 #### 三、...

    C#中的try catch finally用法分析

    总的来说,`try-catch-finally`语句是C#中进行错误处理的核心工具,它使得程序在遇到异常时能够继续执行,而不是直接崩溃,从而提高了程序的健壮性和可靠性。通过熟练掌握这一机制,开发者可以编写出更加稳定且易于...

    面试Java程序员最可能遇到的问题考试大全

    33. **try-finally的执行顺序**:finally中的代码总会在return之前执行。 34. **计算2乘以8**:最简单的方法是`int result = 2 * 8`。 35. **相同的对象,不同的hash code**:错误,对象相等时,hash code应相同。 ...

    ocjp考试题(卷)库.doc

    `try...catch...finally`块中,如果在`try`块中遇到`return`语句,`finally`块会先执行,然后才会执行`return`。所以,代码会打印"Finally",然后返回,不会执行`finally`块后面的语句。因此,正确答案是B。 4. ...

    Java异常处理-异常处理的方式1

    当程序执行过程中遇到异常,会生成一个异常类的对象并抛出。如果这个异常没有被当前方法处理,它会向上层调用者传递,直到找到能够捕获并处理它的代码块,或者到达main()方法。如果main()也不处理,程序就会终止。 ...

    关于Java异常处理机制的深入理解.doc

    异常处理通过`try-catch-finally`块来实现,用于捕获和处理异常,确保程序在遇到错误时仍能保持一定程度的稳定性和可预测性。 首先,`try`块用于包含可能抛出异常的代码。如果在`try`块内发生了异常,控制权将立即...

    java异常处理.doc

    这个例子展示了异常处理的复杂性,特别是当多个嵌套的 `try-catch-finally` 结构存在时。在编写代码时,我们需要谨慎处理异常的传播和处理,确保所有可能抛出异常的代码都包含在 `try` 块中,并适当地捕获和处理异常...

    JAVA中异常处理的WORD文档

    Java中的异常处理是编程实践中必不可少的一部分,它确保了程序在遇到错误或异常情况时能够优雅地处理并继续执行,或者至少提供有用的错误信息。异常处理的主要目的是提高程序的健壮性和稳定性。 1. 为什么需要异常...

    反编译常见问题

    例如,当遇到`break MISSING_BLOCK_LABEL_45;`这样的语句时,它可能表示一个未定义的标签,需要根据上下文找到合适的跳转位置,修复控制流。 处理这些问题的关键是理解原始代码的逻辑,并根据反编译后的代码结构...

Global site tag (gtag.js) - Google Analytics