0

この形式の入力を読み込もうとしています

4 4
* . . .
. . . .
. * . .
. . . .
4 4
* * . .
. . . .
. . . .
. . * .

最初の2つの数字を読み取ることができますが、記号を読み取ろうとすると例外が発生します。BufferedReaderを使用して各行を読み取り、入力を解析できますが、スキャナーでこれを実行できないのはなぜですか?

これは私のコードです

        public static void main(String[] args) {
                Scanner in = new Scanner(System.in);
                while (in.hasNextLine()) {
                    Scanner s = new Scanner(in.nextLine());
                    if (!s.hasNextLine())
                        break;

                    int x = s.nextInt(); // 4
                    int y = s.nextInt(); // 4
                    for (int i = 0; i <= x - 1; i++) {
                        for (int j = 0; j <= y - 1; j++) {
                            System.out.println(s.hasNext()); // false
                            String symbol = s.next(); //NoSuchElementException WHY?
                        }
                    }
                }
            }
        }
4

2 に答える 2

2

そこに数字がないときは、数字を読もうとしないでください。

擬似コードでのループは、次のようになります。

While there is a line available:
    s = NextLine()
    x = FirstInt(s)
    y = SecondInt(s)
    // Some other stuff

とを割り当てるxy、最初の行以外に使用できる番号がないため、アプリケーションがクラッシュします。

問題に一致するより良い解決策は、

Scanner in = new Scanner(System.in);
if (!in.hasNextInt()) exitAndPrintError();
int rows = in.nextInt();
if (!in.hasNextInt()) exitAndPrintError();
int cols = in.nextInt();
for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
        if (!in.hasNext()) exitAndPrintError();
        process(in.next());
    }
}

このソリューションは実際にはエラーをあまりチェックせず、すべてのエラー報告を作成する必要のあるexitAndPrintError関数に任せます。

補足として:試行してfalseを返した場合、例外をスローしないs.hasNext()と驚くはずです。そのため、メソッドを使用できます。これらのメソッドを使用すると、入力の最後に到達したことを知ることができ、使用可能な以上の入力を読み取ろうとはしません。s.next() hasNext*Scanner


このコードを更新して1つのファイルで複数のデータセットを処理するための演習として残しておきますが、それほど難しくはありません。投稿したコードの主なバグは、sからの行のみを使用してスキャナーを作成した場合、処理in中の1行の中に複数行の構造が見つからないことですs

于 2013-02-07T02:16:48.710 に答える
1

全体的な設計上の問題に耐え、私はあなたの質問に答えます。

NoSuchElementExceptionなぜなら、何を推測するか、sそれ以上の要素がないからです。s.hasNext()出力がfalseを返すと、さらに明白になります。

理由は簡単です。sの1行で割り当てinます。

プログラム全体を修正するには、使用する必要があるのは1つのスキャナーだけであり、複数のインスタンスではありません。

于 2013-02-07T02:22:00.110 に答える