【发布时间】:2015-02-11 09:21:35
【问题描述】:
java.io.FileInputStream 类的构造函数 FileInputStream(String name) 声明它抛出了一个 FileNotFoundException,并在其 javadoc 中声明:
如果命名文件不存在,是目录而不是常规文件,或者由于某些其他原因无法打开读取,则抛出
FileNotFoundException。
但是,使用不存在的文件名调用它不会引发任何异常:
@Test(expected = FileNotFoundException.class)
public void nonExistentFileThrowsFileNotFoundException() throws FileNotFoundException {
new FileInputStream("this file totally doesnt exist");
}
此测试失败 - 没有抛出异常。查看构造函数的代码,很明显不应该抛出异常——它只是调用java.io.File构造函数:
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}
这是设计/文档缺陷吗?在我看来,FileInputStream 构造函数既不应该声明 throws FileNotFoundException,也不应该在其 javadoc 中声明它抛出。什么给了?
【问题讨论】:
-
我的测试运行成功。
-
有趣的事实:如果我使用名称
"this file totally doesn't exist"(带有撇号),它会抛出异常,但我想这是因为文件名中不允许使用撇号 -
@ZouZou 你用的是哪个版本的Java?我正在使用 Oracle JDK 8 u 31。
-
您使用的是哪个版本的 JUnit?
-
我也在使用 JUnit 4.11 和 Java 8(虽然我猜 Java 版本不是问题)。很奇怪,我刚刚创建了一个只有这个测试的新测试文件,我没有错误。您是否使用标准程序获得此异常? (只是为了确定问题是否出在 JUnit 上)。