我正在尝试从我的方法输出文件扫描程序对象。这是一项学校作业,我被特别指示不抛出任何异常,但改为使用try / catch。分配要求命令行提示用户扫描文件。如果文件不存在,我们应该告诉用户,然后再次提示他们输入文件。如果文件存在,则该方法返回扫描文件的扫描程序对象。
我的代码有效,但不干净。它涉及2种方法。到目前为止,这是我的代码:
public static Scanner getInputScanner (Scanner console) {
File inputFile = null;
Scanner input = null;
try {
inputFile = getFile(inputFile, console);
input = new Scanner (inputFile);
return input;
} catch (FileNotFoundException e) {
try {
return input = new Scanner (getFile (inputFile, console));
} catch (FileNotFoundException f) {
System.out.println("An error has occured.");
return input;
}
}
}
public static File getFile (File inputFile, Scanner console) {
System.out.println("Enter input file: ");
inputFile = new File (console.nextLine());
while (!inputFile.exists()) {
System.out.println("File does not exist.");
System.out.print("Enter input file: ");
inputFile = new File (console.nextLine());
}
return inputFile;
}
代码的问题是输出如下所示:
输入输入文件:
文件不存在。
输入输入文件:
然后它正在等待用户的输入。我不希望输出在最后一行之前有2行代码。
有人可以解释为什么我的代码输出这2行吗? 另外,有没有更简单的解决方案来获取输入文件而不抛出FileNotFoundException?
谢谢!
答案 0 :(得分:0)
如果我理解正确, 你的程序在运行时输出这些行, 无论, 没有你真正输入文件名的机会。
Enter input file: File does not exist.
然后程序再次问你:
Enter input file:
你不希望前两行,对吗?
例如,如果您收到的Scanner console
中有未读的换行符,就会发生这种情况。
你还没有发布那部分代码,
所以很难说,但这是Scanner
的常见问题。
在致电getInputScanner
之前,
确保Scanner console
可以使用,
没有未读垃圾仍在其中缓冲。
至于你问题的第二部分, 是的,这可以写得更简单,更好,例如:
public static Scanner getInputScanner(Scanner console) {
try {
File inputFile = getExistingFile(console);
return new Scanner(inputFile);
} catch (FileNotFoundException e) {
throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)");
}
}
public static File getExistingFile(Scanner console) {
while (true) {
System.out.println("Enter input file: ");
File inputFile = new File(console.nextLine());
if (inputFile.exists()) {
return inputFile;
}
System.out.println("File does not exist.");
}
}
答案 1 :(得分:0)
一旦调用了getFile(),就会执行下面的行。
System.out.print(“输入输入文件:”);
由于不存在任何文件,以下行继续执行:
while(!inputFile.exists()){
System.out.println ("File does not exist.");
System.out.print("Enter input file: ");
您可以使用throws()而不是try / catch,然后调用者将处理异常。
答案 2 :(得分:0)
在获得用户输入之前,必须通过插入Scanner.nextLine()来消耗扫描仪带来的垃圾。最终代码如下所示:
public static Scanner getInputScanner(Scanner console) {
try {
File inputFile = getExistingFile(console);
return new Scanner(inputFile);
} catch (FileNotFoundException e) {
throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)");
}
}
public static File getExistingFile(Scanner console) {
while (true) {
console.nextLine();
System.out.println("Enter input file: ");
File inputFile = new File(console.nextLine());
if (inputFile.exists()) {
return inputFile;
}
System.out.println("File does not exist.");
}
}