gpt4 book ai didi

java - 了解 'finally' block

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:22 24 4
gpt4 key购买 nike

我已经编写了七个测试用例来理解 finally block 的行为。 finally 背后的逻辑是什么?

package core;

public class Test {
public static void main(String[] args) {
new Test().testFinally();
}

public void testFinally() {
System.out.println("One = " + tryOne());
System.out.println("Two = " + tryTwo());
System.out.println("Three = " + tryThree());
System.out.println("Four = " + tryFour());
System.out.println("Five = " + tryFive());
System.out.println("Six = " + trySix());
System.out.println("Seven = " + trySeven());
}

protected StringBuilder tryOne() {
StringBuilder builder = new StringBuilder();
try {
builder.append("Cool");
return builder.append("Return");
}
finally {
builder = null;
}
}

protected String tryTwo() {
String builder = "Cool";
try {
return builder += "Return";
}
finally {
builder = null;
}
}

protected int tryThree() {
int builder = 99;
try {
return builder += 1;
}
finally {
builder = 0;
}
}

protected StringBuilder tryFour() {
StringBuilder builder = new StringBuilder();
try {
builder.append("Cool");
return builder.append("Return");
}
finally {
builder.append("+1");
}
}

protected int tryFive() {
int count = 0;
try {
count = 99;
}
finally {
count++;
}
return count;
}

protected int trySix() {
int count = 0;
try {
count = 99;
}
finally {
count = 1;
}
return count;
}

protected int trySeven() {
int count = 0;
try {
count = 99;
return count;
}
finally {
count++;
}
}
}

为什么 builder = null 不起作用?

为什么 builder.append("+1") 有效而 count++(在 trySeven() 中) 工作?

最佳答案

一旦您执行了返回,覆盖它的唯一方法就是执行另一个返回(如 Returning from a finally block in Java 中所讨论的,这几乎总是一个坏主意),或者以其他方式突然完成。您的测试永远不会从 finally 返回。

JLS § 14.1定义突然完成。一种突然完成类型是返回。由于返回,1、2、3、4 和 7 中的 try block 突然完成。正如 § 14.20.2 所解释的那样,如果 try block 由于抛出之外的原因 R 突然完成,则立即执行 finally block 。

如果 finally block 正常完成(这意味着没有返回,除其他外),“try 语句突然完成原因 R”。换句话说,try发起的return原封不动;这适用于您的所有测试。如果您从 finally 返回,“try 语句突然完成,原因是 S(并且原因 R 被丢弃)”。 (这里的 S 是新的压倒一切的返回)。

所以在 tryOne 中,如果你这样做了:

finally {
builder = null;
return builder;
}

这个新的返回 S 将覆盖原来的返回 R。

对于 tryFour 中的 builder.append("+1"),请记住 StringBuilder 是可变的,因此您仍然返回对指定同一对象的引用在尝试中。你只是在做最后一分钟的突变。

tryFivetrySix 很简单。由于try中没有return,所以try和finally都正常完成,和没有try-finally一样执行。

关于java - 了解 'finally' block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3226100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com