Eclipse4.4.2でJava8を使用しています.
java
1public class Main { 2 3 public static void main(String[] args) { 4 try (Reader reader = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(reader)){ 5 String[] input = br.readLine().split(","); 6 int start = Integer.parseInt(input[0]); 7 int end = Integer.parseInt(input[1]); 8 int count = (int)IntStream.range(start + 1, end) 9 .parallel() 10 .filter(e ->{//(ある出題サイトの回答の根幹なので伏せます) 11 }).peek(e -> System.out.println(e + " " + Integer.toBinaryString(e))).count(); 12 System.out.println(count); 13 } catch (IOException e) { 14 e.printStackTrace(); 15 } 16 } 17 18}
このようなコードで,tryの後の括弧にあるreaderとbrに黄線が出現し,「リソースリーク:’reader(またはbr)’が閉じられることはありません」と表示されます.
tryブロックがint end = Integer.parseInt(input[1]);
の行までの場合はその部分に黄線は出現せず,使われていないstart,endに警告が出るだけなのですが・・・
なぜtry-with-resources文を使用しているにもかかわらずこのようなことが起こるのでしょうか?
伏せてる部分を(e -> true)にしたら警告は消えました.
伏せてる部分でやってるのはビットシフトとビット積と比較演算で,
使っているメソッドはInteger.highestOneBitだけです.
Eclipse4.4.2+Java8で、プロジェクトのコンパイラー設定はresource leakの2つのチェックを警告にして、貼っていただいたコードのfilterはラムダ式を(e ->{ return true; })にしてコンパイルしてみましたが、警告は出ませんでした。
swordoneさんの環境では伏せている部分を改変して再現が可能でしょうか?
回答1件
あなたの回答
tips
プレビュー