間違ったタイプが入力されたときに、スキャナーが例外をスローするのを防ぐにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2496239

質問

サンプルコードは次のとおりです。

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 特定の条件が満たされるまでプロンプトを続けてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top