0

私は値を入力するようにユーザーに求めているメソッドを実装しました。上記の値が範囲外であるか、正しい値のタイプでない場合は、エラーメッセージが表示され、再度確認する必要があります。スキャナを使用して正しい入力値を取得する

public static Integer getValue (Integer minValue, Integer maxValue) { 
    Scanner input; 
    input = new Scanner (System.in); 
    Integer value; 
    value = null; 
    while (true) { 
     try { 
      value = input.nextInt(); 
      input.nextLine(); 
      if ((value >= minValue) && (value <= maxValue)) { 
       break; 
      } else { 
       // Shows message that says value is not in range. 
       continue; 
      } 
     } catch (InputMismatchException IME) { 
      // Shows message that says value is not an integer. 
      input.next(); 
      continue; 
     } 
    } 
    input.close(); 
    return(value); 
} 

コードは、望ましくない値が与えられたときに正しく識別できます。この問題は、値が実際に正しい場合に発生し、次にハングアップしてデバッガにかかります。

これは、実行の例です:

Select the type of furniture: 
1. - Dresser. 
2. - Shelf. 
3. - Rectangular table. 
4. - Round table. 
You chose: abc // Asks again because the value entered is not int. 
a b c 
adsf 
5 // Asks again because the value entered is not in range. 
1 // Here it is when the compiler takes me to the debugger. 

は、ここで私はこの時点過去の実行を強制した場合、何が起こるかです。それは私の下のメニューを示し、それは完全に別の値をユーザーに尋ねた後クラッシュ:

Select the type of wood. 
1. - Mahogamy. 
2. - Cherry-tree. 
3. - Walnut. 
4. - Pine tree. 
5. - Oak tree. 
You chose: Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 

これは、それがメインから呼ばれています方法です:

furnitureMenu(); 
indexTree = getValue(minIndexFurniture, maxIndexFurniture); 
woodMenu(); 
indexWood = getValue(minIndexWood, maxIndexWood); 

それは私がこのメソッドは仕事を得ることが重要です上記のように、私はメニューから選択するだけでなく、寸法などの家具の仕様を取得するために、何度かユーザーからの入力を必要とするためです。

すべてのご協力をいただきありがとうございます。前もって感謝します。

+0

私のコンピュータでこの機能を実行しても問題はありませんでした。 –

+0

@FallaCoulibalyあなたはあなたのメインの中でそれをもう一度呼び出すことができますか、それが私のためにしたようにハングアップまたはクラッシュするかどうかを確認できますか? – ShadowGeist

+0

私はこのようなメインからそれを呼び出しました。Integer indexTree = getValue(0、4); –

答えて

0

私はすでにこのサイトで私の他の関連する質問を徹底的に見て結論に達しました。これは、それを解く一つの質問です:あなたが呼び出すと、java.util.NoSuchElementException - Scanner reading user input

sc.close()第一の方法では、それはあなたの スキャナを閉じたが、同様にあなたSystem.in入力ストリームをクローズしていないだけ。私の質問に見られるように

、私のコードは私のメソッド内の新しいスキャナーをインスタンス化し、正しい値が入力された後、メソッドは、メソッドがその後呼び出された後に入力するための新たな入力を防ぐスキャナを閉じます。

これは私が作ったリビジョンである:この改正に見られるように

public static Integer getValue (Scanner input, int minValue, int maxValue) { 
    int value; 
    value = 0; 
    while (true) { 
     try { 
      value = input.nextInt(); 
      if((value < minValue) || (value > maxValue)) { 
       // ERROR message goes here 
      } else { 
       break; // Input successful, break loop. 
      } 
     } catch (InputMismatchException IME) { 
      // ERROR message goes here. 
      input.nextLine(); // Discards input so user can try again 
     } 
    } 
    return (value); 
} 

それにメソッドの内部ユーザからの入力を取得することができるように、スキャナは、予めメイン関数でインスタンス化、引数として渡されましたその後の呼び出し。

私も第11章プログラムする方法を、JavaのそれはDeitelの本からの入力要約筆記を受ける方法を改善:例外処理を、と私は私の特定のケースにそれを適応。

0
public static Integer getValue(Integer minValue, Integer maxValue) { 
     Scanner input; 
     input = new Scanner(System.in); 
     int value; 
     while (true) { 

System.out.println("Please enter a value"); 
      if(!input.hasNextInt()) { 
       System.out.println("That's not a number!"); 
       input.next(); // this is important! 
      } 
      value = input.nextInt(); 
      if ((value >= minValue) && (value <= maxValue)) { 
       return value; 
      } else { 
       System.out.println("Wrong value please provide a valid input"); 
      } 
     } 

    } 

これを試してください。あなたがしたいことを達成するのに役立つかもしれません。

+0

この回答には例外処理がありません。私の元の質問に示されているように、このメソッドは、与えられた入力がガベージかどうか(例えば整数が必要なときはdoubleや文字列)かどうかを知る必要があります。 – ShadowGeist

+0

@ShadowGeist私の編集した答えを確認してください –

+0

信頼できるソース(Deitelの本)から直接拾い上げられたので、私が与えた答えとほぼ同じです。私はthoを助けるあなたの努力に感謝します。 – ShadowGeist

関連する問題