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]);
您不想关闭扫描仪,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;
}
你应该在循环之前初始化'Scanner',而不是在里面。不要关闭它! – Berger
不要关闭扫描仪..这将使它关闭'System.in' ...并且你不能接受任何输入... – Codebender
什么是方法'commandLine(args)'? –