如何循环try catch语句?

2024-03-06

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

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

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 操作是否有效going to由于硬盘错误、网络驱动器错误等而失败。
  3. 对于打开与删除/取消链接/重命名竞争条件没有解决方案。虽然在正常使用中很少见,但这种错误可以有针对性如果相关文件对安全至关重要。

正确的方法是简单地尝试打开文件,然后捕获并处理IOException如果发生的话。它更简单、更强大,而且可能更快。对于那些认为异常不应该用于“正常流程控制”的人来说,这isn't正常流量控制...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何循环try catch语句? 的相关文章

随机推荐