我开始自学更多关于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());
}
我没有收到任何错误或警告信息。
为什么会发生这种情况,我该怎么做才能解决这个问题?
答案 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
,它将永远不会抱怨,因为RuntimeException
是Exception
的子类型,因此您的尝试也会尝试捕获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()会帮助你找到文件是否存在。