Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-程序跳过扫描程序(System.in)_Java_Java.util.scanner - Fatal编程技术网

Java-程序跳过扫描程序(System.in)

Java-程序跳过扫描程序(System.in),java,java.util.scanner,Java,Java.util.scanner,嗨,这里有一位Java初学者。 在puzzleInput函数中,我打开了一个扫描器,从用户那里获取输入。出于某种原因,程序不会给我一个输入的机会,因此参数(谜题)会得到一个空值作为默认值,然后当需要谜题时(不是空值),抛出一个NullPointerException。 代码中还有很多其他的函数,但大多数都只是打印命令,那些没有被我检查过的都可以。 问题是扫描仪不会给我一个输入的机会。 我想进一步澄清以下几点: 1.程序没有跳过第一个扫描程序(文件名),我可以给它一个参数。 2.我确保我关闭了之前

嗨,这里有一位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();