6

我有一些命令可以在磁盘上创建一个文件。因为必须在其中创建文件的文件夹是动态的,所以我有一个 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;
}
4

2 回答 2

5

您遇到的具体问题也可能不是 FileNotFoundException。通过在一个 catch 块(它是所有异常的父类)中使用“异常”,这实际上是一个“全部捕获”,因为如果有一个“异常”或其任何子类被抛出,它将运行。

尝试以下更改:

...

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

这将告诉您该块捕获的异常的特定类。我敢打赌,您会发现 Exception 实际上是子类的一个实例(例如 IOException)。

于 2011-05-05T14:40:41.877 回答
1

您的问题是 FileNotFoundException 被抛出 java 库深处的某个地方并且没有传播,因此您无法捕获它。这里真正的罪魁祸首是一个 NullPointerException 源自

ImageIO.write(image, "png", new File(fileName));

称呼。这个跑进你的catch (Exception e)街区。
如果您catch (NullPointerException e)在一般异常捕获之前添加一个块,您会看到它在那里。

于 2013-04-29T19:34:04.823 回答