5

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

5 回答 5

11

如果您想在失败后重试,则需要将该代码放入循环中;例如这样的:

boolean done = false;
while (!done) {
    try {
        ...
        done = true;
    } catch (...) {
    }
}

(do-while 是一个稍微优雅的解决方案。)

Exception但是,在这种情况下捕捉是不好的做法。它不仅会捕获您期望发生的异常(例如IOException),还会捕获意外的异常,例如NullPointerException程序中的错误症状等。

最佳实践是捕获您期望(并且可以处理)的异常,并允许任何其他异常传播。在您的特定情况下,捕捉FileNotFoundException就足够了。(这就是Scanner(File)构造函数声明的内容。)如果您没有使用 aScanner作为输入,则可能需要 catchIOException代替。


我必须纠正投票最多的答案中的一个严重错误。

do {
    ....
} while (!file.exists());

这是不正确的,因为测试文件是否存在是不够的:

  • 该文件可能存在,但用户没有读取它的权限,
  • 该文件可能存在但是一个目录,
  • 该文件可能存在但由于硬盘错误或类似原因而无法打开
  • 该文件可能会在exists()测试成功和随后尝试打开它之间被删除/取消链接/重命名。

注意:

  1. File.exists()仅测试文件系统对象是否以指定路径存在,而不是它实际上是一个文件,或者用户对其具有读取或写入权限。
  2. 由于硬盘错误、网络驱动器错误等原因,无法测试 I/O 操作是否会失败。
  3. 打开与删除/未链接/重命名竞争条件没有解决方案。虽然在正常使用中很少见,但如果有问题的文件对安全性至关重要,则可以针对这种错误。

正确的方法是简单地尝试打开文件,并在IOException它发生时捕获并处理。它更简单、更健壮,而且可能更快。对于那些会说不应将异常用于“正常流量控制”的人来说,这不是正常的流量控制......

于 2012-09-02T04:51:02.593 回答
7

不要使用 try catch 块,而是尝试do while循环检查文件是否存在。

do {

} while ( !file.exists() );

这种方法在java.io.File

于 2012-09-02T04:50:51.033 回答
1

您可以简单地将其包装在一个循环中:

while(...){

    try{

    } catch(Exception e) {

    }

}

但是,捕获每个异常并假设它是由于文件不存在可能不是解决此问题的最佳方法。

于 2012-09-02T04:50:56.400 回答
1

尝试这样的事情:

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. ");
    }
}
于 2012-09-02T04:51:36.360 回答
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);
于 2012-09-02T05:07:13.020 回答