間違ったタイプが入力されたときに、スキャナーが例外をスローするのを防ぐにはどうすればよいですか?
-
21-09-2019 - |
質問
サンプルコードは次のとおりです。
import java.util.Scanner;
class In
{
public static void main (String[]arg)
{
Scanner in = new Scanner (System.in) ;
System.out.println ("how many are invading?") ;
int a = in.nextInt() ;
System.out.println (a) ;
}
}
私がプログラムを実行してそれを与える場合 int
お気に入り 4
, 、それからすべてがうまくいきます。
一方、私が答えると too many
それは私の面白い冗談を笑いません。代わりに(予想どおり)これを取得します:
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at In.main(In.java:9)
「侵入しているものはいくつありますか?」では、INTSではないエントリを無視したり、再プロンプトを無視したりする方法はありますか?これらの両方を行う方法を知りたいです。
解決
多くのいずれかを使用できます hasNext*
その方法 Scanner
事前検証のためにあります。
if (in.hasNextInt()) {
int a = in.nextInt() ;
System.out.println(a);
} else {
System.out.println("Sorry, couldn't understand you!");
}
これを防ぎます InputMismatchException
投げられることからさえ、あなたはいつもそれを確認するからです 意思 あなたがそれを読む前に一致します。
java.util.Scanner API
boolean hasNextInt()
: : 戻り値true
このスキャナーの入力の次のトークンが、を使用してデフォルトラジックスのINT値として解釈できる場合nextInt()
方法。 スキャナーは、入力を超えて前進しません。String nextLine()
: 現在のラインを通過してこのスキャナーを進めます スキップされた入力を返します。
太字のセクションに留意してください。 hasNextInt()
入力を超えて前進しません。戻ってきた場合 true
, 、呼び出してスキャナーを進めることができます nextInt()
, 、それは投げません InputMismatchException
.
戻ってきた場合 false
, 、次に、「ゴミ」をすり抜ける必要があります。これを行う最も簡単な方法は、呼び出すだけです nextLine()
, 、おそらく2回ですが、少なくとも1回は1回です。
なぜあなたがする必要があるかもしれないかもしれない nextLine()
2回は次のとおりです。これが入力された入力であると仮定します。
42[enter]
too many![enter]
0[enter]
スキャナーがその入力の先頭にあるとしましょう。
hasNextInt()
本当です、nextInt()
戻り値42
;スキャナーは現在あります 直前 最初[enter]
.hasNextInt()
偽です、nextLine()
空の文字列を1秒間返しますnextLine()
戻り値"too many!"
;スキャナーは現在あります すぐ後 二番目[enter]
.hasNextInt()
本当です、nextInt()
戻り値0
;スキャナーは現在あります 直前 第3[enter]
.
これらのもののいくつかをまとめる例は次のとおりです。あなたはそれを実験してその方法を研究することができます Scanner
作品。
Scanner in = new Scanner (System.in) ;
System.out.println("Age?");
while (!in.hasNextInt()) {
in.next(); // What happens if you use nextLine() instead?
}
int age = in.nextInt();
in.nextLine(); // What happens if you remove this statement?
System.out.println("Name?");
String name = in.nextLine();
System.out.format("[%s] is %d years old", name, age);
入力は次のとおりです。
He is probably close to 100 now...[enter]
Elvis, of course[enter]
次に、出力の最後の行は次のとおりです。
[Elvis, of course] is 100 years old
他のヒント
一般的に、私は本当に、読み取りと解析の両方で同じライブラリコールを使用して本当に嫌いです。言語ライブラリは非常に柔軟性がないようで、しばしばあなたの意志に曲がることはできません。
system.inからデータを取得する最初のステップは失敗しないようにするため、文字列として変数に読んでから、その文字列変数をintに変換します。変換が失敗した場合は、エラーをプリントして続行します。
例外を投げることができるものでストリームを包むと、混乱全体があなたのストリームを残していると状態だけを混乱させます。
それは常に利益です 持ってる エラーが発生したときにアプリケーションが発生したときにエラーを投げます。 保つ それは起こってからです。
1つの選択肢は、コードを内部にラップすることです try {...}
catch {...}
のためのブロック InputMismatchException
。また、コードを内部にラップしたいと思うかもしれません while
を持っているループ Scanner
特定の条件が満たされるまでプロンプトを続けてください。