JAVA + try catch(FileNotFoundException e)进入catch(Exception e)吗?

7
我有一些命令可以在磁盘上创建文件。 由于文件夹是动态的,因此我有一个catch(FileNotFoundException e)。在同一个try块中,我已经有了一个catch(Exception e)块。 但是,当我运行代码并且文件夹尚不存在时,却使用了catch(Exception e)块,而不是FileNotFoundException块。
然而,调试器很清楚(至少对我来说),显示了一个FileNotFoundException:java.io.FileNotFoundException: c:\mydata\2F8890C2-13B9-4D65-987D-5F447FF0DDA7\filename.png(系统找不到指定的路径)。
有任何想法为什么它不进入FileNotFoundException块? 谢谢;
代码:
import java.io.FileNotFoundException;

try{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Rectangle screenRectangle = new Rectangle(screenSize);
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture(screenRectangle);
    ImageIO.write(image, "png", new File(fileName));
}
catch (FileNotFoundException e){
    // do stuff here..
    return false;
}
catch(Exception e){
    // do stuff here..
    return = false;
}

3
如果您发布出现问题的实际代码片段将会很有帮助。此外,请确保您导入的FileNotFoundException与正在引发的异常相同。如果类路径上还有另一个库也有FileNotFoundException,您的IDE可能会导入错误的包。虽然不太可能,但首先排除这种可能性非常重要。 - Jberg
请同时发布代码和堆栈跟踪信息。 - Bhushan
应该可以工作。按照@normalocity建议的方法确认异常类名。我敢猜测它可能是一个通用的IOException。 - JustinKSU
2个回答

5

你遇到的问题未必是FileNotFoundException,使用catch块中的"Exception"(它是所有异常的父类)实际上是一个“捕捉所有”,因为它会在发生任何异常或其子类时运行。

尝试进行以下更改:

...

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

这将告诉你此代码块捕获的异常具体类别。我敢打赌,你会发现该异常实际上是某个子类的实例(例如 IOException)。


1
你的问题是FileNotFoundException在Java库的深处被抛出,并且没有向上传播,因此你无法捕获它。 真正的罪魁祸首是NullPointerException源自于。
ImageIO.write(image, "png", new File(fileName));

调用。这个会进入你的catch (Exception e)块。
如果在一般的异常捕获之前添加一个catch (NullPointerException e)块,你会看到它会进入那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接