如何循环try catch语句?

Str*_*res 4 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. ");
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 10

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

boolean done = false;
while (!done) {
    try {
        ...
        done = true;
    } catch (...) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

然而,Exception在这种背景下捕捉是不好的做法.它不仅会捕获您期望发生的异常(例如IOException),还会捕获意外的异常,例如NullPointerException等等,这些都是程序中的错误症状.

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


我必须纠正最高票的答案中的一个严重错误.

do {
    ....
} while (!file.exists());
Run Code Online (Sandbox Code Playgroud)

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

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

注意:

  1. File.exists() 仅测试文件系统对象是否存在指定路径,而不是实际上是文件,或者用户具有读取或写入权限.
  2. 由于硬盘错误,网络驱动器错误等原因,无法测试I/O操作是否失败.
  3. open vs deleted/unlinked/renamed race condition没有解决方案.虽然在正常使用情况下很少见,但如果相关文件具有安全关键性,则可以针对此类错误.

正确的方法是简单地尝试打开文件,并捕获并处理IOException它是否发生.它更简单,更强大,可能更快.对于那些会说异常不应该用于"正常流量控制"的人来说,这不是正常的流量控制......


squ*_*guy 8

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

do {

} while ( !file.exists() );
Run Code Online (Sandbox Code Playgroud)

这个方法是在 java.io.File