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

问题描述:

我有一个名为isValidFile的方法,它接收用户输入字符串并确定它是否是有效文件。方法输出是文件类型。我可以在命令行中输入两个文件名并正确处理它们。我也可以参加1个有效的和1个无效的。如果输入的不正确,isValidFile将检查有效性并提示用户输入有效的文件名。但是,它将无法使用2个无效输入。我打电话给他们如下....JAVA - 方法适用于第一次调用,但不适用于第二次

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。为什么第一次调用方法而不是第二次调用会起作用? isValidFile

请输入一个有效的文件名或Q的

开始戒烟。

in.txt

IS VALID FILE? in.txt isValidFile

isValidFile

请输入一个有效的文件名或Q的

开始

END退出。

异常线程 “main” java.util.NoSuchElementException:没有线 发现

在java.util.Scanner.nextLine(来源不明)

在Project6.isValidFile(Project6.java:53 )

在Project6.main(Project6.java:9)

--- 53行是行:字符串validFile = in.nextLine(); ---第9行是:File toParse = isValidFile(inLinse [1]);

+0

你应该在循环之前初始化'Scanner',而不是在里面。不要关闭它! – Berger

+0

不要关闭扫描仪..这将使它关闭'System.in' ...并且你不能接受任何输入... – Codebender

+0

什么是方法'commandLine(args)'? –

您不想关闭扫描仪,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; 
}