Java:DO-WHILEループ内のtry-catchステートメント
-
20-12-2019 - |
質問
私はユーザー入力値をスキャンするビットのコードを実行しようとしています。このアクションは、gettriangledim()という名前のカスタムメソッドに含まれています。メソッドはUser Int値を読み込み、それが一定の範囲内にあることを確認してから、入力されたint値を返します。この方法はうまく機能し、私はそれに問題がありません。
gettriangleDim()メソッドにint以外の値を入力すると、問題が発生します。それは私にInputMismatchExceptionエラーを与えます。この問題を解決しようとするために、Try-CatchステートメントをDO-WHILEループに書きました。しかし、これは私が今までtry-catchの声明を使ったことがあるのは初めてです、そして私は明らかに何かを欠いています。
DO-whileループ内にネストされたtry-catchステートメントのコード:
//loop to scan for triangle dimension
boolean bError = true;
int triangle;
do{
try {
triangle = getTriangleDim();
bError=false;
}
catch (Exception e){
System.out.println("You did not enter an integer, please enter an integer value");
triangle = getTriangleDim();
}
}while (bError);
.
INTの代わりにCHAR値を入力してテストした場合は、実際にはエラーが一度キャッチされてから、「しなかった」ステートメントを印刷します。しかし、もう1つのint以外の番号を再入力した場合、私はそれを推測した........ InputMismatchExceptionエラー。
私の方法のコードはこちら:
//method for scanning triangle dimensions from keyboard
public static int getTriangleDim(){
int triangle = 0;
Scanner keyboard = new Scanner(System.in);
do{
System.out.print("Enter a non-zero integer length (+/-1 - +/-16): ");
triangle = keyboard.nextInt();
if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)))
System.out.println("Inpute value outside of range");
}while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)));
return triangle;
}
.
続行するにはDO-WHILEループが必要ですが、これらのエラーが発生し続けます。
解決
catch
ブロックで入力を求める必要はありません。あなたはすでにループに入っているので、例外を引くことができ、あなたに有効な入力を与えるようにユーザーに伝えてください、そしてそれ以外のことをする必要はありません - あなたは先頭に戻って回ってください。
do{
try {
triangle = getTriangleDim();
bError=false;
} catch (Exception e){
System.out.println("You did not enter an integer, please enter an integer value");
// Don't do anything else in here: we will loop back to the beginning again and get new input!
}
}while (bError);
.
サイドノートとして(そして気づいたとおり)、triangle
のため、そのtry
ブロックの外側に"triangle might not have been initialized"
を使用しようとすると、コードは現在コンパイルされません。これは、コンパイラが、プログラムが実行時に行うものであることを判断できません。 / a>:つまり、Compilerは、triangle
が常にそのループ内で初期化されることを確認できません。したがって、変数宣言は、triangle
もいくつかのデフォルト値に設定する必要があります。 0
はint
の通常のデフォルトですが、プログラムで意味があるものは何でも使用します(0
コードに基づいて、getTriangleDim
のように見えます)。
int triangle = 0;
do { // etc.
.
このように、triangle
がループを残すまでに値を持つようになるコンパイラを "推奨"できること、そしてあなたはそれを他の場所で使うことができるでしょう。