FileNotFoundException中定义的私有构造函数?

时间:2017-03-27 18:42:11

标签: java constructor private

随机地我偶然发现了这个网站:http://resources.mpi-inf.mpg.de/d5/teaching/ss05/is05/javadoc/java/io/FileNotFoundException.html

FileNotFoundException有三个定义的构造函数:

    FileNotFoundException()
          Constructs a FileNotFoundException with null as its error detail message.

    FileNotFoundException(String s)
          Constructs a FileNotFoundException with the specified detail message.

    private FileNotFoundException(String path, String reason)
          Constructs a FileNotFoundException with a detail message consisting of the given pathname string followed by the given reason string.

但最后一个构造函数被定义为private?

再次,在这里:http://www.docjar.com/html/api/java/io/FileNotFoundException.java.html我们可以看到完整的类定义。没有其他代码,所以单例模式显然不用于那种情况,我们也看不出,为什么应该阻止它在对象之外实例化类,也不是工厂方法,静态(实用类)方法或仅限常数类。

我是C#dev所以我可能不知道这里发生的一些事情,但我仍然会感兴趣为什么它被定义为私有,它的用途以及是否有任何示例或用例最后一个构造函数。

评论提及:

  

此私有构造函数仅由本机I / O方法调用。

有人详细解释了这一点吗?

2 个答案:

答案 0 :(得分:4)

请记住:JVM的许多库都是用Java编写的,就像异常一样。但在与“世界其他地方”互动时; Java迟迟不会再做了 - 需要使用C / C ++来进行真正的系统调用。

含义:与文件IO相关的某些操作无法在Java中完全实现。因此 native 代码进来(编译后的二进制文件)。但是,当然,这样的呼叫也会失败。但是,人们需要一种手段来在Java方面进行沟通 - 换句话说:需要抛出异常。

鉴于您引用的评论,这似乎非常简单:当某些IO相关的原生操作失败时;他们将使用该私有构造函数来创建异常,然后将其抛出“you”。 原生方法可以调用 private 方法!

编辑:但是在查看implementation时,对于该构造函数确实存在 nothing 特定内容。可以使用此私有ctor创建的完全相同的消息轻松构造此类异常。

private FileNotFoundException(String path, String reason) {
  super(path + ((reason == null)
             ? ""
             : " (" + reason + ")"));
}

所以,我的个人猜测:这甚至可能是一些“剩余”。 15年前具有某种意义的东西;但不再是“真正的意义”。或者更简单的是, convenience 方法允许本机代码传递null或非null原因字符串。

答案 1 :(得分:3)

有问题的构造函数是私有的,因此没有其他类可以使用它来初始化实例。原则上,它可以由类本身使用 - 当一个构造函数被另一个构造函数或工厂方法调用时,这种情况并不罕见。

然而,在这种情况下,文档提供了一个不同的原因,您实际上引用了它:

  

此私有构造函数仅由本机I / O方法调用。

这对我来说似乎很清楚,但我认为您的混淆可能围绕Java访问控制的细节 - 特别是它不适用于本机方法。因此,实现各种I / O功能的本机方法可以通过私有构造函数实例化FileNotFoundException,无论它们属于哪个类。