※当サイトの記事には、広告・プロモーションが含まれます。

JavaのScannerクラスとSystem.inのコラボでハマる

Scannerクラスで入力されたストリーム(ここではSystem.in)をEclipse(Version: Neon.3 Release (4.6.3))で使おうとすると警告が出てしまいます。

f:id:ts0818:20170623211045j:plain

『リソース・リーク : 'scan' が閉じられることはありません』 という警告が...。

警告を出ないようにするにはなかなか面倒くさい感じになっちゃいました。

package training03;

import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;

public class List3_6 {

  public static void main(String[] args) {
    //
    System.out.println("【数あてゲーム】");
    // ランダムな整数を生成(0~9まで)
    int ans = new Random().nextInt(9);
    // 入力値格納用
    int input_num;
    // 入力回数
    int input_count = 0;
    // 表示メッセージ格納用
    String message;
    // アタリはずれ判定のフラグ
    boolean correct_flug = false;

    // 繰り返し(5回)
    for(int i = 0; i < 5; i++) {
      // アタリが出たか、入力回数が5回に達したら、
      if(correct_flug || input_count == 5) {
        // for文を抜ける
        break;
      }
      System.out.println("0~9の数字を入力してください");
      // System.inでEclipseが警告を出さないようにtry-with-resource文
      try(Scanner scan = new Scanner(System.in)) {
        // whileで囲まないとNoSuchElementExceptionエラー
        while(true) {
          // 入力回数が5回に達したら、
          if(input_count == 5) {
            scan.close();
            break;
          }
          // キーボードでの入力値を格納
          input_num = scan.nextInt();
          // 入力値がランダムな整数と等しければ、
          if(input_num == ans) {
            message = "アタリ!";
            correct_flug = true;
            scan.close();
          } else {
            message = "違います";
          }
          System.out.println(message);
          // whileを抜けるかどうか
          if(message.equals("アタリ!")) {
            break;
          }
          input_count++;
        }
      } catch(InputMismatchException e) {
        System.out.println("0~9までの数値を入力してください");
        break;
      }

    }
    System.out.println("ゲームを終了します");

  }

}


なんでも、ファイルの内容などをストリームで取得するさいは、openしたあとcloseしてリソースを閉じないといけないらしいのですが、ScannerでSystem.inの場合は、別にcloseする必要はないようです。(その場合は警告が表示されるけど無視して構わないと講師の方が仰っていました。)

全然スッキリしないけど、大丈夫なのだろうか...。幸先不安ですわ~。

f:id:ts0818:20170623213751j:plain

 

標準入力の罠とか - Qiita

eclipseで「リソース・リーク:’stdIn’閉じられることはありま... - Yahoo!知恵袋