gpt4 book ai didi

java - Break 在有资源的 try 中不起作用,但在没有资源的 try 中起作用

转载 作者:行者123 更新时间:2023-12-01 09:26:39 26 4
gpt4 key购买 nike

Break 在有资源的 try 中不起作用,但在没有资源的 try 中起作用!
这是这种情况的一个简单示例。我在工作项目中发现了这个“错误”。当我使用没有资源的尝试时

try {
Resources resources = getResources()
// some code here, look below
}

我的循环只有一次迭代,这是正确的,因为我有条件“如果为真则中断”,但是当我更改尝试时,无需追索尝试使用资源。

try (Resources resources = getResources()) {
// some code here, look below
}

我震惊了!循环变得无限!为什么?

完整代码:

public class Test {
public static void testTryWithResAndBreak() {
while (true) {
System.out.println("we are in (while(true))");
try (Resources resources = getResources()) {
System.out.println("We are in try block");
if (true) {
System.out.println("We are in the if(true) now! Next step is break");
break;
}
System.out.println("OOOOO___OOOO WE ARE HERE!!!");
resources.writeSomething();
} catch (Exception e) {
System.out.println("Catched exception");
}
}
}
private static class Resources implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Resources closed");
throw new Exception("Exception after closed resources!");
}

public void writeSomething() {
System.out.println("i wrote something");
}
}

private static Resources getResources() {
return new Resources();
}

public static void main(String[] args) {
testTryWithResAndBreak();
}
}

最佳答案

循环是无限的,因为您的关闭发生在 try 范围的末尾。这会引发异常,从而中断中断操作。然后异常处理程序(位于 while 循环内部)捕获它,并继续到循环末尾,并且由于循环条件为“true”,因此将永远继续。当您不使用 try-with-resource 时,永远不会调用 close,因此不会引发异常,并且不会中断中断。

关于java - Break 在有资源的 try 中不起作用,但在没有资源的 try 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777022/

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