15

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

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プログラムを実行してlikeを付けると、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)

int ではないエントリを無視するか、「何人が侵入していますか?」というプロンプトを再表示する方法はありますか? この二つの方法を教えていただきたいです。

4

3 に答える 3

20

事前検証用の多くの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 回は を呼び出すことです。

2 回行う必要がある理由nextLine()は次のとおりです。これが入力されたものであるとします。

42[enter]
too many![enter]
0[enter]

スキャナがその入力の先頭にあるとしましょう。

  • hasNextInt()真の場合は;をnextInt()返します。42スキャナーは最初の の直前に[enter]なりました。
  • hasNextInt()false の場合nextLine()は空の文字列を返し、2 番目の場合は をnextLine()返します"too many!"。スキャナーは2 番目の直後に[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
于 2010-03-23T00:48:44.303 に答える
2

一般に、読み取りと解析の両方に同じライブラリ呼び出しを使用することは本当に嫌いです。言語ライブラリは非常に柔軟性がないように思われ、多くの場合、自分の意志に合わせることはできません。

System.in からデータを取得する最初のステップは失敗できないはずなので、文字列として変数に読み取らせてから、その文字列変数を int に変換します。変換に失敗した場合は、エラーを出力して続行してください。

例外をスローする可能性のあるものでストリームをラップすると、混乱全体がストリームをどのような状態にするのか、ちょっと混乱します。

于 2010-03-22T23:15:54.223 に答える
1

エラーが発生しないようにする方法とは対照的に、エラーが発生したときにアプリケーションでエラーをスローすることには常に利点があります。

try {...} catch {...}1 つの代替方法は、コードをブロック内にラップすることですInputMismatchExceptionwhileコードをループ内にラップしてScanner、特定の条件が満たされるまでプロンプトを出し続けることもできます。

于 2010-03-22T22:33:59.047 に答える