アフィリエイト広告を利用しています

2019年01月25日

JAVA scannerクラスのnextInt()を利用した際、無限ループに陥ってしまう

scannerクラスのnextInt()を利用し、キーボードから数値を入力させる。
このとき、数値以外の文字が入力されると、プログラムの書き方によっては無限ループに陥ってしまう。

【Ex.】 数値を3つ入力させる。数値以外の文字が入力された場合は再度入力を促す。
 public static void main(String[] args) {
  int input[] = new int[3];
  Scanner scan = new Scanner(System.in);

  System.out.println("数字を入力してください");
  for(int n = 0;n < 3;n++){
   System.out.print((n + 1) + "個目 :");
   try{
    input[n] = scan.nextInt();
   }
   catch(InputMismatchException e){
    System.out.println("数字を入力してください");
    System.out.println("もう一度入力してください");
    n--;
   }
  }
 }


上記プログラムは、一見問題なく動くように見えるが、文字が入力されると無限ループに陥ってしまう。
これは、スキャナが InputMismatchException をスローすると、例外の原因となったトークンを読み飛ばさないため。

つまり、文字が入力され例外が発生した場合、
通常は(readLine()などでは)エラーになった文字は捨ててしまうが(読み飛ばしてしまうが)、
nextInt()はそれを読み飛ばさないため、永遠にエラー文字を読み取り続け無限ループに陥ってしまう。

この場合、オブジェクトを初期化し「前回のエラー文字を持っていない」新しいオブジェクトで呼び出すようにすることで解消される。
 public static void main(String[] args) {
  int input[] = new int[3];

  System.out.println("数字を入力してください");
  for(int n = 0;n < 3;n++){
   System.out.print((n + 1) + "個目 :");
   try{
    Scanner scan = new Scanner(System.in);
    input[n] = scan.nextInt();
   }
   catch(InputMismatchException e){
    System.out.println("数字を入力してください");
    System.out.println("もう一度入力してください");
    n--;
   }
  }
 }
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/8501976
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
その買うを、もっとハッピーに。|ハピタス
\ハピタスの紹介キャンペーンです/
⇒登録後に行う「ハピタス検定」の答えはこちら

※ハピタスをもっと知りたいかたは他で検索してみてください

ブログ内を検索
ファン
カテゴリ
よく倒されますが、へこたれながら起き上がるSEの備忘録です

Windows(20)
SQL(1)
JAVA(4)
VBScript(14)
VBA(15)
Other(14)
書籍(1)
記事ランキング
  1. 1. 確率の収束に必要な試行回数
  2. 2. no img Tera Term(テラターム) 覚えておくと便利なコマンド一覧
  3. 3. no img VBScript マウスポインタを自動的に移動させクリックするスクリプト
  4. 4. no img Windows ディスク使用率100%を改善させる
  5. 5. VBScript タスクスケジューラのメッセージを最前面に表示するスクリプト
広告
会員登録せずに無料で読める!! 漫画読み放題のサービス

動画編集・YouTuberを始めたい方向け 無料動画編集ソフト

クラウド型レンタルサーバー クラウド型レンタルサーバー

Amazonで購入する
※Amazonのアソシエイトとして、七転八起SEの備忘録は適格販売により収入を得ています。

メンタルヘルス・マネジメント検定試験II種ラインケアコース過去問題集_2023年度版
メンタルヘルス・マネジメント検定試験II種 過去問題集〈2023年度版〉