【问题标题】:FileInputStream not throwing FileNotFoundException as documented?FileInputStream 没有按照记录抛出 FileNotFoundException?
【发布时间】: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 上)。

标签: java java-io


【解决方案1】:

PEBKAC

是的,这发生了:

我对@9​​87654322@ 进行了相同的测试,它一定是创建了该文件——这就是该测试实际找到该文件的原因。 FileOutputStream 反过来不会为不存在的文件抛出异常,因此该测试毫无意义。我好尴尬。谢谢大家。

【讨论】:

  • 不要在此处发布文字图片,因为您可以轻松地发布文字。浪费带宽,降低易读性,没有什么可推荐的。
  • @EJP 这不是文字图片,而是我的目录树的一部分的图片。图片应该显示我的 IntelliJ 窗口的一部分,以表明该文件实际上是在我的项目目录中创建的。它说明的不仅仅是上面的文字。
  • 它可以作为文本复制粘贴。去做。这是我的五分钱,我不会为你的照片付钱。
  • 恕我直言,我仍然不同意复制和粘贴文本会传达相同的信息。我要离开图片:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2012-06-19
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多