为什么Eclipse要通过试用臂进行管理?
BufferedReader reader = null;
try {
if (condition) {
try {
reader = method1();
} catch (Exception e) {
...
}
}
if (reader == null) {
reader = method2();
}
do things ...
} catch(Exception e) {
...
} finally {
if (reader != null) {
reader.close();
}
}
有更好的方法来处理这种情况吗?或只是日食的垃圾警告?
此案例无效:
try (BufferedReader reader = null) {
if (condition) {
reader = method1();
} else {
reader = method2();
}
do things ...
}
答案 0 :(得分:1)
尝试:
try (BufferedReader reader = createBufferedReader(condition)) {
do things ...
}
private BufferedReader createBufferedReader(boolean condition){
if (condition) {
return method1();
} else {
return method2();
}
}
答案 1 :(得分:1)
Java语言规范在jls-14.20.3
中说明如果未明确声明为final,则在ResourceSpecification中声明的资源将隐式声明为 final (第4.12.4节)。
所以你不能在你的try块中改变它。如果您希望能够更改它,请使用标准的try-catch-finally块。其他选择是在使用try-with-resources之前决定正确的资源。
答案 2 :(得分:1)
在Seby的回答中,你不一定需要Callable或lambda表达式。
鉴于问题很简单,你可以简单地使用一个三元运算符,它适用于所有版本的java。
final String s = "abc";
try (BufferedReader reader = (condition) ? method1() : method2();) {
do things ...
} catch (Exception e) {
...
}
答案 3 :(得分:0)
你可以使用一个返回类型为BufferedReader的函数,你可以在其中使用条件调用,只有满足你正在寻找的某些特定条件时,才可以从main调用此函数。
private BufferedReader createReader(!XYZ){
if(a>b)
return abc();
else
return def();
}
public static void main(String[] args){
createReader(!XYZ);
}
答案 4 :(得分:0)
最好的方式imho,清晰简洁:
final String s = "abc";
try (BufferedReader reader = new Callable<BufferedReader>() {
@Override
public BufferedReader call() throws Exception {
if (condition) {
return method1();
}
return method2();
// different scope, s needs final keyword
}
}.call()) {
do things ...
} catch (Exception e) {
...
}
在Java 8中也更容易:
String s = "abc";
try (BufferedReader reader = () -> {
if (condition) {
return method1();
}
return method2();
// same scope, s does not need final keyword
}) {
do things ...
} catch (Exception e) {
...
}