Java-程序跳过扫描程序(System.in)
嗨,这里有一位Java初学者。 在puzzleInput函数中,我打开了一个扫描器,从用户那里获取输入。出于某种原因,程序不会给我一个输入的机会,因此参数(谜题)会得到一个空值作为默认值,然后当需要谜题时(不是空值),抛出一个NullPointerException。 代码中还有很多其他的函数,但大多数都只是打印命令,那些没有被我检查过的都可以。 问题是扫描仪不会给我一个输入的机会。 我想进一步澄清以下几点: 1.程序没有跳过第一个扫描程序(文件名),我可以给它一个参数。 2.我确保我关闭了之前打开的所有其他扫描仪。 有人能解释一下我做错了什么吗 程序不会给我一个输入的机会 您的问题是您正在关闭Java-程序跳过扫描程序(System.in),java,java.util.scanner,Java,Java.util.scanner,嗨,这里有一位Java初学者。 在puzzleInput函数中,我打开了一个扫描器,从用户那里获取输入。出于某种原因,程序不会给我一个输入的机会,因此参数(谜题)会得到一个空值作为默认值,然后当需要谜题时(不是空值),抛出一个NullPointerException。 代码中还有很多其他的函数,但大多数都只是打印命令,那些没有被我检查过的都可以。 问题是扫描仪不会给我一个输入的机会。 我想进一步澄清以下几点: 1.程序没有跳过第一个扫描程序(文件名),我可以给它一个参数。 2.我确保我关闭了之前
main
中的Scanner
:
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();
这反过来会关闭输入流中的系统,该输入流随后无法在puzzleInput()
方法中重用,因为它已关闭。在这里正确的做法是将Scanner
变量传递到puzzleInput()
方法中,并继续在那里重用它,而不是尝试打开新的Scanner
Scanner fileName = new Scanner(System.in);
...
fileName.close();
其他几点意见:
- 调用
扫描仪
文件名
不是一种好模式。为变量选择好的名称将有助于代码自文档化<代码>扫描仪
当然是一个更好的名称
在处理任何输入/输出时,最好将任何打开方法包装在一个文件中,以便正确地接近。另请参见Java7中添加的
如果您希望有机会通过提示对输入执行某些操作,为什么不将其分配给字符串变量?这也允许您在以后以任何方式操作输入
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 puzzleS=new Scanner(System.in)代码>String test=puzzleS.next()代码>如果这样做有效,那么您可以更快地查明问题。您是说在拼图输入中?这就是我写的…close()
方法和关闭扫描器同时也在关闭扫描器从中读取数据的资源,在您的例子中是System.in
。即使在已关闭的资源上创建了另一个扫描仪,也无法再读取该资源。因此,在确定应用程序不需要读取System.in之前,不要调用close()
。也不要为同一资源创建两个扫描程序。创建一个并将其传递给其他方法(如果需要)。可能是OT,但您的puzzleInput()
中有一个递归,并且不使用它的返回值。如果有帮助,请务必接受答案。我想就是这样。谢谢
String input = scannerName.nextLine();