来自Eclipse的Java try-with资源警告

时间:2014-01-22 11:38:21

标签: java eclipse warnings try-with-resources

为什么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 ...
}

5 个答案:

答案 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) {
  ...
}