JAVA - 方法适用于第一次呼叫,但不适用于第二次呼叫

时间:2016-04-14 15:41:58

标签: java methods java.util.scanner nosuchelementexception

我有一个名为isValidFile的方法,它接收用户输入字符串并确定它是否是有效文件。方法输出属于File类型。我可以在命令行中输入2个文件名并正确处理它们。我也可以接受1个有效,1个无效。如果输入的文件名不正确,则isValidFile将检查有效性并向用户提供有效的文件名。但是,它不适用于2个无效输入。我称之为......

    String[] inLines = commandLine(args);
    File reservedWords = isValidFile(inLines[0]);
    File toParse = isValidFile(inLines[1]);

这是我的isValidFile方法......

public static File isValidFile(String userFile){
    System.out.println("START OF isValidFile");
    File inFile = new File(userFile);
    Scanner in = null;
    while(!inFile.exists() || inFile.isDirectory()){
        System.out.println("Please enter a valid file name or Q to quit.");
        in = new Scanner(System.in);
        String validFile = in.nextLine();
        System.out.println("IS VALID FILE? " + validFile);            // TEST LINE
        if(validFile.equalsIgnoreCase("q")){  
            System.out.println("\nProgram terminated by user.");
            in.close();
            return null;
        } else inFile = new File(validFile);
        if (inFile.exists()) in.close();
    }
    System.out.println("END OF isValidFile\n");
    return inFile;
}

您可以看到我放入测试行的位置,以显示开头,结尾和打印出来的文件名(如果已接受)。这是我的输出。您可以看到,一旦我输入第一个参数的有效文件,它就会询问第二个参数的文件名,但不允许我输入任何信息。它只是抛出一个NoSuchElementException。为什么第一次调用方法而不是第二次调用呢?

  

START OF isValidFile

     

请输入有效的文件名或Q以退出。

     

in.txt

     

是有效的文件吗? in.txt

     

结束isValidFile

     

START OF isValidFile

     

请输入有效的文件名或Q以退出。

     

线程中的异常" main" java.util.NoSuchElementException:没有行   结果

     

at java.util.Scanner.nextLine(Unknown Source)

     

在Project6.isValidFile(Project6.java:53)

     

在Project6.main(Project6.java:9)

     

---第53行是行:String validFile = in.nextLine();

     

---第9行是行:File toParse = isValidFile(inLinse [1]);

1 个答案:

答案 0 :(得分:0)

您不想关闭扫描仪,b / c它将关闭System.in。 System.in(即标准输入)由整个进程共享,因此对isValidFile的每个方法调用都是从同一标准输入读取的。如果它在第一次调用isValidFile结束时关闭,则在下次调用时它将失败。因此,它适用于第一个输入,但不适用于第二个输入。

public File isValidFile(String userFile){
    System.out.println("START OF isValidFile");
    File inFile = new File(userFile);
    Scanner sc = new Scanner(System.in);
    while(!inFile.exists() || inFile.isDirectory()){
        System.out.println("Please enter a valid file name or Q to quit.");
        String validFile = sc.nextLine();
        System.out.println("IS VALID FILE? " + validFile);            // TEST LINE
        if(validFile.equalsIgnoreCase("q")){  
            System.out.println("\nProgram terminated by user.");
            return null;
        } else inFile = new File(validFile);
    }
    System.out.println("END OF isValidFile\n");
    return inFile;
}