当前位置: 首页 > 面试题库 >

Java为什么在finally块中更改返回的变量不会更改返回值?

昝晗昱
2023-03-14
问题内容

我有一个简单的Java类,如下所示:

public class Test {

    private String s;

    public String foo() {
        try {
            s = "dev";
            return s;
        } 
        finally {
            s = "override variable s";
            System.out.println("Entry in finally Block");  
        }
    }

    public static void main(String[] xyz) {
        Test obj = new Test();
        System.out.println(obj.foo());
    }
}

这段代码的输出是这样的:

Entry in finally Block
dev  

为什么s不在finally块中覆盖,而是控制打印输出?


问题答案:

try与所述的执行块完成return语句和的值s在时间return语句执行是由该方法返回的值。finally子句稍后s(在return语句完成之后)更改值的事实(此时)并未更改返回值。

请注意,以上内容处理的s是对finally块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不是),并且该对象的内容在finally块中已更改,则这些更改将在返回值中看到。

有关所有操作方式的详细规则,请参见Java语言规范的14.20.2节。请注意,执行一条return语句就算是该try块的突然终止(适用于“ 如果try块的执行由于任何其他原因而突然完成的部分,R .... ” 开头)。有关为什么语句突然终止块的信息,请参见JLS的14.17节return。

进一步详细说明:如果语句的try块和语句finally块都try-finally由于return语句而突然终止,则适用第14.20.2节中的以下规则:

如果try由于任何其他原因R [除了引发异常]突然突然完成了该finally块的执行,则将执行该块,然后可以选择:

  • 如果该finally块正常完成,则该try语句由于原因R突然完成。
  • 如果该finally块由于原因S突然完成,则该try语句由于原因S突然完成(并且原因R被丢弃)。
    结果是,块中的return语句finally确定了整个try-finally语句的返回值,并且该try块的返回值被丢弃。try-catch-finally如果该try块引发异常,它被一个catch块捕获,并且该catch块和该finally块都具有return语句,则语句中也会发生类似的事情。


 类似资料:
  • 问题内容: 为什么更改总和顺序会返回不同的结果? = = 双方的Java和JavaScript的返回相同的结果。 我知道,由于以二进制表示浮点数的方式,某些有理数( 例如1/3-0.333333 … )无法精确表示。 为什么简单地更改元素的顺序会影响结果? 问题答案: 也许这个问题很愚蠢,但是为什么仅仅改变元素的顺序会影响结果呢? 它将根据值的大小更改四舍五入的点。作为示例 _样的_事情,我们所看

  • 问题内容: 近我很惊讶地发现,在Java的finally块中可能有一个return语句。 似乎很多人都认为这是一件坏事,如“ 不要在finally子句中返回”中所述。更深入地研究,我还发现“ Java的回报并不总是 ”,这在finally块中显示了其他类型的流控制的一些非常可怕的示例。 因此,我的问题是,谁能给我一个示例,其中finally块中的return语句(或其他流控制)产生更好/更具可读性

  • 问题内容: 我有一个存储过程,如下所示: 我遇到的问题是,该站点本月没有任何事件,因此当我运行此proc时,我为该站点返回了NULL值,但是我需要返回零/ 0以便在内部使用SSRS中的图表。 我曾尝试使用合并和isull无济于事。 有没有一种方法可以正确格式化此格式? 干杯, 背风处 问题答案: 放在外面: 如果要返回多行,请将INNER JOIN更改为 LEFT JOIN 顺便说一句,如果没有保

  • 为什么改变求和顺序会返回不同的结果? = Java和JavaScript都返回相同的结果。 我知道,由于浮点数在二进制中的表示方式,一些有理数(如1/3-0.333333...)不能精确表示。 为什么简单地改变元素的顺序会影响结果?

  • 考虑: 为什么改变的值会改变的值?

  • 谁能给我解释一下,当我改变从find函数返回的值时,为什么原始数组中的值会改变呢?是不是有一个我缺失的概念?在执行代码之后,我将得到下面提到的输出。