public static char[] puzzleInput() {
printEnterPuzzleMessage();
Scanner puzzleS = new Scanner(System.in);
if(puzzleS.hasNext()) {
char[] puzzle = puzzleS.next().toCharArray();
while(!isLegalPuzzleStructure(puzzle)) {
printIllegalPuzzleMessage();
puzzleInput();
}
return puzzle;
}
puzzleS.close();
return null;
}
public static void main(String[] args) throws Exception{ //Q - 8
Scanner fileName = new Scanner(System.in);
if(!fileName.hasNext()) {
System.out.println("No argument has been received");
System.exit(0);
}
String filePath = fileName.nextLine();
fileName.close();
Scanner vocabulary = new Scanner(new File(filePath));
String[] vocabularyArr = scanVocabulary(vocabulary);
vocabulary.close();
printReadVocabulary(filePath, vocabularyArr.length);
printSettingsMessage();
printEnterPuzzleMessage();
char[] puzzle = puzzleInput();
嗨,Java的初学者就在这里。 在函数puzzleInput中,我打开一个Scanner来获取用户的输入。出于某种原因,程序不会给我机会输入,因此参数(谜题)默认为null,后来当需要拼图而不是null时 - 抛出NullPointerException。 代码中还有许多其他功能,但大多数只是一个打印命令,而那些不是由我检查,并且没问题。 问题是扫描仪不会让我有机会输入输入。 我想进一步澄清一些观点: 1.程序没有跳过第一个Scanner(fileName),我可以给它一个参数。 我确保关闭了之前打开过的所有其他扫描仪。 有人可以解释一下我做错了吗?
答案 0 :(得分:1)
程序没有给我机会输入
您的问题是,您正在关闭Scanner
中的main
:
Scanner fileName = new Scanner(System.in);
...
fileName.close();
这反过来会关闭System.in
输入流,然后无法在puzzleInput()
方法中重复使用,因为它已经关闭。在这里做的正确的事情是将Scanner
变量传入您的puzzleInput()
方法并继续在那里重复使用而不是尝试打开一个新的Scanner
}。
public static char[] puzzleInput(Scanner scanner) {
printEnterPuzzleMessage();
if(scanner.hasNext()) {
...
// don't close it here
return null;
}
...
Scanner scanner = new Scanner(System.in);
...
puzzleInput(scanner);
其他几条评论:
Scanner
fileName
不是一个好模式。为变量选择好名称将有助于使代码自我记录。当然,scanner
会是一个更好的名字。try/finally
block中,以便正确关闭。另请参阅Java 7中添加的try-with-resources functionality。答案 1 :(得分:0)
如果您希望有机会通过提示对输入执行某些操作,为什么不将其分配给String变量?这允许您稍后操作输入,但也可以稍后操作。
String input = scannerName.nextLine();