【问题标题】:Why am I getting errors with my Java try...catch?为什么我的 Java try...catch 出现错误?
【发布时间】:2013-12-12 05:18:35
【问题描述】:

我开始自学更多关于 Java 错误处理的知识,这是我第一个尝试查看特定错误的程序,而不是使用 catch (Exception e) 作为通用的包罗万象的 catch。

我正在删除一个文件并返回一条消息,说明该文件已成功删除或删除失败。在删除失败的情况下,如果找不到文件,我想发送错误消息。

这是我目前所处的位置:

public static void deleteOldConcatFiles(File concatFile) {
    try
    {
        if(concatFile.delete()) {
            System.out.println(concatFile.getName() + " is deleted!");
        } else {
            System.out.println("Delete operation failed.");
        }
    }
     //
    catch(FileNotFoundException f) {
        System.out.println("Exception: "+ f.getMessage().getClass().getName());
    }
}

当我运行它时,我收到一条警告:This this is an unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body.

但是,当我使用这个 catch 块运行时,

catch(Exception f) {
     System.out.println("Exception: "+e.getMessage().getClass().getName());
}

我没有收到任何错误或警告消息。

为什么会发生这种情况,我可以做些什么来解决它?

【问题讨论】:

  • 这似乎很容易解释。它不会抛出那个异常。也许你正在寻找IOException
  • Exception 是RuntimeException 的基类,但也有不是RuntimeException 的异常,例如FileNotFoundException。 RuntimeExceptions 不需要被捕获,也不需要 throw 子句,因此编译器无法判断它是否会被抛出。因此,它允许捕捉它们。

标签: java exception error-handling


【解决方案1】:

因为抛出的错误类型与您捕获的错误类型不匹配。试试这个...

catch(Exception e) {
  System.out.println("Exception: "+ e.getClass());
}

这将向您显示您应该捕获的错误类型。显然这不是一个好的做法,但它是一个很好的练习,可以看到正在发生的事情。此页面上有关已检查和未检查异常的其他答案非常简洁。

【讨论】:

    【解决方案2】:

    信息不是很清楚吗?由于您不构造 File 对象,因此永远不会在此 try 块中抛出 FileNotFoundException。因此编译器会通知你 catch 块是不必要的。

    【讨论】:

      【解决方案3】:

      如果您查看手册here delete() 只会抛出SecurityException.

      此外,它返回一个boolean 值,指示文件是否被删除。如果一切顺利,这应该是向用户指示所需的所有信息。

      【讨论】:

        【解决方案4】:

        寻找 IOException。或 deleteifExist 方法,如果你对异常不感兴趣,如果你想 retrn 某些东西,那么 file.exists() 将帮助你确定文件是否存在。

        【讨论】:

          【解决方案5】:

          Java 支持两种异常:已检查异常(静态检查)和未检查异常(RuntimeException 及其子类型)。

          Java 编译器可以在编译时判断是否可以抛出已检查异常(例如FileNotFoundException)或绝对不能抛出。对于未经检查的异常(例如IndexOutOfBoundsException),它无法判断。因此,它会警告尝试捕获无法出现的已检查异常。

          如果你捕捉到Exception,它永远不会抱怨,因为RuntimeException是Exception的子类型,所以你的尝试也会尝试捕捉IndexOutOfBoundsException等异常。

          正如其他人所指出的,FileNotFoundException 永远不会被 delete 抛出。此外,它是一个检查异常。所以Java编译器会报错。

          【讨论】:

            【解决方案6】:

            File.delete() 不会抛出 FileNotFoundException,即使文件不存在。

            FileNotFoundException 是一个检查异常(即,不是 RuntimeException),因此任何抛出它的代码都必须声明它。因为File.delete() 没有声明它抛出 FileNotFoundException,编译器保证它不会,并且可以保证你的 catch 块永远不会被调用。

            第二个,catch-all 块不会生成警告,因为它还捕获 RuntimeExceptions(RuntimeException extends Exception),编译器不会为您检查。因此,它可能会被调用,编译器不确定,所以它不会警告你。

            【讨论】:

            • 您的答案是正确的,所以 +1,但合同掩盖了所发生事情的真实性质。检查异常 (SecurityException) 是要查找的重要内容 - 如果您尝试分离职责,函数返回 (true 或 false) 也非常重要。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-20
            • 1970-01-01
            • 2022-12-10
            相关资源
            最近更新 更多