我编写了七个测试用例来理解finally
堵塞。背后的逻辑是什么finally
works?
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++;
}
}
}
Why builder = null
不管用?
为什么builder.append("+1")
工作而count++
( in trySeven()) 做not work?
一旦你执行了返回,覆盖它的唯一方法是执行另一个返回(如讨论从 Java 中的 finally 块返回,这几乎总是一个坏主意),或者突然完成。你的测试永远不会从finally中返回。
JLS §14.1定义突然完成。突然完成类型之一是返回。 1、2、3、4 和 7 中的 try 块由于返回而突然完成。正如§所解释的14.20.2,如果 try 块由于除 throw 之外的原因 R 突然完成,则立即执行 finally 块。
如果finally块正常完成(这意味着没有返回等),“try语句由于原因R而突然完成”。换句话说,由 try 发起的返回保持不变;这适用于您的所有测试。如果从finally返回,“try语句由于原因S突然完成(并且原因R被丢弃)”。 (这里的 S 是新的最重要的回报)。
所以在 tryOne 中,如果你这样做了:
finally {
builder = null;
return builder;
}
这个新的回报 S 将覆盖原来的回报 R。
For builder.append("+1")
in tryFour
,请记住 StringBuilder 是可变的,因此您仍然返回对 try 中指定的同一对象的引用。你只是在做最后一刻的突变。
tryFive
and trySix
都是直截了当的。由于try中没有return,所以try和finally都正常完成,执行起来和没有try-finally一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)