如何循环try / catch语句?我正在制作一个使用扫描仪读取文件的程序,它正在从键盘上读取它。所以我想要的是如果文件不存在,程序会说“这个文件不存在请再试一次”。然后让用户键入不同的文件名。我尝试了几种不同的方法尝试这样做但是,我的所有尝试最终导致程序崩溃。
这就是我所拥有的
try {
System.out.println("Please enter the name of the file: ");
Scanner in = new Scanner(System.in);
File file = new File(in.next());
Scanner scan = new Scanner(file);
} catch (Exception e) {
e.printStackTrace();
System.out.println("File does not exist please try again. ");
}
答案 0 :(得分:9)
如果要在失败后重试,则需要将该代码放在循环中;例如像这样的东西:
boolean done = false;
while (!done) {
try {
...
done = true;
} catch (...) {
}
}
(do-while是一种稍微优雅的解决方案。)
然而,在这种情况下抓住Exception
是不好的做法。它不仅会捕获您期望发生的异常(例如IOException
),还会捕获意外的异常,例如NullPointerException
等,这些都是程序中的错误症状。
最佳做法是捕获您期望(并且可以处理)的异常,并允许任何其他人传播。在您的特定情况下,捕获FileNotFoundException
就足够了。 (这就是Scanner(File)
构造函数声明的内容。)如果您没有使用Scanner
作为输入,则可能需要捕获IOException
。
我必须纠正最高投票答案中的严重错误。
do {
....
} while (!file.exists());
这是不正确的,因为测试文件是否存在是不够的:
exists()
测试成功和后续尝试打开之间被删除/取消链接/重命名。请注意:
File.exists()
仅测试文件系统对象是否存在指定路径,而不是它实际上是文件,或者用户具有读取或写入权限。正确的方法是简单地尝试打开文件,并在发生时捕获并处理IOException
。它更简单,更强大,可能更快。对于那些会说异常不应该用于“正常流量控制”的人来说,这个不是正常的流量控制......
答案 1 :(得分:8)
不要使用try catch块,而是尝试do while
循环检查文件是否存在。
do {
} while ( !file.exists() );
此方法位于java.io.File
答案 2 :(得分:1)
您可以简单地将其包裹在一个循环中:
while(...){
try{
} catch(Exception e) {
}
}
但是,捕获每个异常并假设它是由于文件不存在而导致的可能不是最好的方法。
答案 3 :(得分:0)
尝试这样的事情:
boolean success = false;
while (!success)
{
try {
System.out.println("Please enter the name of the file: ");
Scanner in = new Scanner(System.in);
File file = new File(in.next());
Scanner scan = new Scanner(file);
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("File does not exist please try again. ");
}
}
答案 4 :(得分:0)
使用API检查文件是否存在。
String filename = "";
while(!(new File(filename)).exists())
{
if(!filename.equals("")) System.out.println("This file does not exist.");
System.out.println("Please enter the name of the file: ");
Scanner in = new Scanner(System.in);
filename = new String(in.next();
}
File file = new File(filename);
Scanner scan = new Scanner(file);