みんな私が探しているものの周りで多くの 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;
}