0

为什么对 Eclipse 来说,这是用 try-with 臂来管理的?

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 ...
}
4

5 回答 5

1

正如jls-14.20.3中的 Java 语言规范所述

如果在 ResourceSpecification 中声明的资源未显式声明为 final,则它被隐式声明为final(第 4.12.4 节)。

所以你不能在你的 try 块中改变它。如果您希望能够更改它,请使用标准 try-catch-finally 块。其他选项是在将资源与 try-with-resources 一起使用之前决定正确的资源。

于 2014-01-22T12:03:04.403 回答
1

尝试:

try (BufferedReader reader = createBufferedReader(condition)) {
  do things ...
}

private BufferedReader createBufferedReader(boolean condition){
  if (condition) {
    return method1();
  } else {
    return method2();
  }
}
于 2014-01-22T11:44:44.583 回答
1

您不一定需要 Seby 的答案中的 Callable 或 lambda 表达式。

鉴于问题很简单,您可以简单地使用三元运算符,它适用于所有版本的 java。

final String s = "abc";

try (BufferedReader reader = (condition) ? method1() : method2();) {

  do things ...

} catch (Exception e) {
  ...
}
于 2015-11-21T15:32:46.623 回答
0

最好的方式恕我直言,清晰简洁:

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) {
  ...
}
于 2014-01-22T12:43:58.730 回答
0

您可以使用返回类型为 BufferedReader 的函数,您可以在其中使用条件调用,仅当满足您正在寻找的某些特定条件时,才能从 main 调用此函数。

private BufferedReader createReader(!XYZ){
if(a>b)
return abc();
else
return def();
}

public static void main(String[] args){
createReader(!XYZ);
}
于 2014-01-22T11:53:06.767 回答