catch中的return语句的行为,最后

时间:2012-02-28 05:47:42

标签: java try-catch-finally

public class J {

     public Integer method(Integer x) 
        {
            Integer val = x;
            try 
            {

                    return val;
            } 
            finally 
            {
                     val = x + x;
            }
        }
        public static void main(String[] args) 
        {
            J littleFuzzy = new J();
            System.out.println(littleFuzzy.method(new Integer(10)));
        }

}

它将返回“10”。

现在我只是将Return type Integer替换为StringBuilder并且输出已更改。

public class I {

     public StringBuilder method(StringBuilder x) 
        {
            StringBuilder val = x;
            try 
            {

                    return val;
            } 
            finally 
            {
                     val = x.append("aaa");
            }
        }
        public static void main(String[] args) 
        {
            I littleFuzzy = new I();
            System.out.println(littleFuzzy.method(new StringBuilder("abc")));
        }


}

OutPut是“abcaaa”

所以,任何人都可以详细解释我。 有什么区别。?

3 个答案:

答案 0 :(得分:4)

只是因为immutable中的整数所以在方法返回之后即使在方法中更改了值也没有反映,并且反映在StringBuilder对象

修改

public class J {
    public String method(String x) {
        String val = x;
        try {
            return val;
        } finally {
            val = x + x;
        }
    }

    public static void main(String[] args) {
        J littleFuzzy = new J();
        System.out.println(littleFuzzy.method("abc"));
    }
}

答案 1 :(得分:0)

StringBuilder上的主要操作是append和insert方法,它们被重载以接受任何类型的数据。每个都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入字符串生成器。 append方法总是在构建器的末尾添加这些字符; insert方法在指定的位置添加字符。

例如,如果z引用当前内容为“start”的字符串构建器对象,则方法调用z.append(“le”)将导致字符串构建器包含“startle”,而z.insert( 4,“le”)会改变字符串生成器以包含“starlet”。

通常,如果sb引用StringBuilder的实例,则sb.append(x)与sb.insert(sb.length(),x)具有相同的效果。每个字符串构建器都有容量。只要字符串生成器中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。

StringBuilder的实例不适合多线程使用。如果需要这样的同步,则建议使用StringBuffer。

在上面的方法中,最后阻止每次调用。

答案 2 :(得分:0)

传递对象时,会传递其引用的副本,如果内容可变,则可以更改内容。