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

試す:

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's answer のように、 Callable またはラムダ式は必ずしも必要ではありません。

問題が単純なので、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 に答える