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

広告

posted by fanblog

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

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

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

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

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

×

この広告は30日以上新しい記事の更新がないブログに表示されております。