如何循环try catch语句?

问题描述 投票:0回答: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. ");
    }
java loops try-catch
5个回答
13
投票

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

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. 可以针对此类错误
  4. 正确的方法是简单地尝试打开文件,并捕获并处理
IOException

(如果发生)。 它更简单、更强大,而且可能更快。 对于那些认为异常不应该用于“正常流量控制”的人来说,这

不是
正常流量控制......


7
投票
do while

循环检查文件是否存在。


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

这个方法在
java.io.File

    


2
投票

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. "); } }



1
投票

while(...){ try{ } catch(Exception e) { } }

但是,捕获 
every

异常并假设这是由于文件不存在可能不是解决此问题的最佳方法。


0
投票

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);

	
© www.soinside.com 2019 - 2024. All rights reserved.