如何循环try catch语句?

时间:2012-09-02 04:47:20

标签: java loops try-catch

如何循环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. ");
    }

5 个答案:

答案 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()测试成功和后续尝试打开之间被删除/取消链接/重命名。

请注意:

  1. File.exists()仅测试文件系统对象是否存在指定路径,而不是它实际上是文件,或者用户具有读取或写入权限。
  2. 由于硬盘错误,网络驱动器错误等原因,无法测试I / O操作是否失败。
  3. open vs deleted / unlinked / renamed race condition没有解决方法。虽然在正常使用情况下这种情况很少见,但如果有问题的文件对安全性至关重要,则可以将此类错误定为
  4. 正确的方法是简单地尝试打开文件,并在发生时捕获并处理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);