为什么我的Java try ... catch会出错?

时间:2013-11-26 20:48:58

标签: java exception error-handling

我开始自学更多关于Java错误处理的内容,这是我的第一个程序,我试图查看特定的错误,而不是使用catch (Exception e)作为通用的catch-all 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(Exception f) {
     System.out.println("Exception: "+e.getMessage().getClass().getName());
}

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

为什么会发生这种情况,我该怎么做才能解决这个问题?

6 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

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

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

如果您抓住Exception,它将永远不会抱怨,因为RuntimeExceptionException的子类型,因此您的尝试也会尝试捕获IndexOutOfBoundsException等异常。

正如其他人所说,FileNotFoundException永远不会抛出delete。此外,它是一个检查异常。所以Java编译器会抱怨。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

如果您查看手册here delete(),则只会引发SecurityException.

此外,它返回boolean值,表示文件是否已删除。这应该是向用户表明一切是否成功所需的所有信息。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

查找IOException。或者deleteifExist方法如果你对异常不感兴趣,如果你想要回溯一些东西,那么file.exists()会帮助你找到文件是否存在。