我有一个java类,用户提供文件路径,如果路径不存在,我请他们再试一次。我的教授说我们应该用一个例外来解决这个问题。
以下是我目前正在做的事情的片段:
public class SalesUtil {
public static void processSales() {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter sales file name: ");
String salesFile = keyboard.nextLine();
try {
Scanner scanFile = new Scanner(new File(salesFile));
//do stuff
}
} catch(FileNotFoundException fnfe) {
System.out.println("Invalid file name supplied, please try again.");
processSales();
}
}
}
在do stuff
部分,我正在计算值并将数据打印到控制台。如果我在第一次尝试时正确输入了正确的文件名,则所有数据都是正确的。如果数据不正确一次或多次不正确。
我想这是因为在我的初始堆栈顶部添加函数调用并且在提供后续堆栈调用时从不“退出”初始堆栈,直到提供了正确的文件?
我还是java的新手,并希望了解如何使用异常来解决这个问题。
答案 0 :(得分:1)
使用file.exist()方法检查,如果您想要做的是确保它存在,那么这就是代码:
File sfile = new File(salesFile);
if (sfile.exists()) {
// ok, file exist do something.
...
}
另一方面,当你说“无效文件”可能是任何东西,如果它是坏文件名,那么它是另一种动物(好吧,不同的例外)......
对于只读文件使用try / catch,然后:
try {
FileInputStream sfile = new FileInputStream(salesFile);
...
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
答案 1 :(得分:1)
FileNotFoundException
是正确的,但是我知道你担心堆栈会积累吗?经过多次尝试失败后,我测试了回读文件,这很好。递归调用位于方法的最后,因此它是最后一行代码,因此堆栈不应该有任何影响。
但是,如果需要,可以使用while循环而不是递归来避免堆栈堆积:
public static void processSales() {
Scanner scanFile = null;
Scanner keyboard = new Scanner(System.in);
while (scanFile == null) {
System.out.println("Enter sales file name: ");
String salesFile = keyboard.nextLine();
try {
scanFile = new Scanner(new File(salesFile));
while (scanFile.hasNextLine()) {
System.out.println(scanFile.nextLine());
}
} catch(FileNotFoundException fnfe) {
System.out.println("Invalid file name supplied, please try again.");
}
}
}