伙计们,我在我正在寻找的内容中和周围看到了很多 Q/A,但不完全是我正在寻找的内容。
情况:我正在从文件中读取 suduko 谜题。首先我通过 verify() 方法运行它们,在该方法中调用 next 并检查(预期的)81 个数字中的每一个,以确保它们在 1 和 9 之间。然后我将我的运行计数与 81 进行比较。只要计数 == 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)
有人说尝试访问关闭的流会导致此错误,但我从不关闭流。我在main中打开文件,并将其作为参数传递给构造函数,然后构造函数将其传递给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;
}