0

みんな私が探しているものの周りで多くの Q/A を見ていますが、正確には私が探しているものではありません。

状況: ファイルから suduko パズルを読み込んでいます。まず、verify() メソッドを実行して next を呼び出し、(予想される) 81 個の数字のそれぞれをチェックして、それらが 1 から 9 の間であることを確認します。実行中のカウントを 81 と比較します。count == 81 である限り、少なくともパズルを解く能力があることはわかっています..nextInt() を使用してストリームに再アクセスしようとすると [今回はそれぞれにsuduko 配列に] プログラムがクラッシュし、NoSuchElement が報告されます。

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:838)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at edu.dccc.dpr212.suduko.SudokuPuzzle.<init>(SudokuPuzzle.java:31)
at edu.dccc.dpr212.suduko.Sudoku.main(Sudoku.java:30)

閉じたストリームにアクセスしようとするとこのエラーが発生するという人もいますが、ストリームを閉じることはありません。メインでファイルを開き、それを引数としてコンストラクターに渡します。コンストラクターはそれをverify(Scanner input)メソッドに渡し、スキャナーで nextInt() を呼び出し、コンストラクターが再びアクセスします[ nextInt() を使用します。 ] パズルに数字を割り当てます。

verify メソッドが nextInt メソッドを使い果たし、リセットされないことが起こっていると思います..これは可能ですか? どうすればこれを回避できますか?スキャナーを回しすぎていませんか?

コードは以下のとおりです。

public SudokuPuzzle(Scanner input)
{

    //verify puzzle FORMAT is correct 
    if (verifyPuzzle(input)) {
        //Load Numbers Into Puzzle Array
        for (int row = 0; row < 9; row++){
            for (int column = 0; column < 9; column++) {
                grid[row][column] = input.nextInt();        
            }
        }       
    }
}

/**Verify Puzzle Is Valid Before Attempting To Solve
 * 
 * @param input (file)
 * @return true if puzzle is valid
 */
public boolean verifyPuzzle(Scanner input) {
    boolean isVerified = false;
    int temp = 0, count = 0;

    while (!input.hasNextInt() == false) {
        temp = input.nextInt();

        // Are Numbers Within Range (1 - 9)?
        if (temp > 9 || temp < 0)
        {
            System.out.println ("Puzzle Is Invalid. " + temp + " is an invalid number in Suduko.");
            count--; //Ensures that last number will not generate valid puzzle count and return puzzle as valid
            break;
        }
        count++;
    }

    //Are There Enough Numbers?
    if (count != 81)
        System.out.println ("Puzzle Is Invalid. Does Not Contain 81 Numbers"); 
    else
        isVerified = true;

    return isVerified;
}
4

0 に答える 0