Java - 程序跳过Scanner(System.in)

时间:2017-11-18 20:27:31

标签: java java.util.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();

嗨,Java的初学者就在这里。 在函数puzzleInput中,我打开一个Scanner来获取用户的输入。出于某种原因,程序不会给我机会输入,因此参数(谜题)默认为null,后来当需要拼图而不是null时 - 抛出NullPointerException。 代码中还有许多其他功能,但大多数只是一个打印命令,而那些不是由我检查,并且没问题。 问题是扫描仪不会让我有机会输入输入。 我想进一步澄清一些观点: 1.程序没有跳过第一个Scanner(fileName),我可以给它一个参数。 我确保关闭了之前打开过的所有其他扫描仪。 有人可以解释一下我做错了吗?

2 个答案:

答案 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();