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

Java FileNotFoundException中定义的私有构造函数?,java,constructor,private,Java,Constructor,Private,我偶然发现这个网站: 类FileNotFoundException有三个已定义的构造函数: FileNotFoundException() Constructs a FileNotFoundException with null as its error detail message. FileNotFoundException(String s) Constructs a FileNotFoundException with the s

我偶然发现这个网站:

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

同样,这里:我们可以看到完整的类定义。没有其他代码,因此singleton模式显然不用于这种情况,我们也看不出为什么应该阻止它在对象之外实例化类,也不是工厂方法、静态(实用类)方法或仅常量类

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

评论提到:

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


有人对此做了更详细的解释吗?

请记住:JVM的许多库都是用Java编写的,就像那个例外。但当与“世界其他地方”互动时;Java迟早不会再这样做了——为了进行真正的系统调用,需要与C/C++对话

意思是:某些与文件IO相关的操作不能完全用Java实现。因此,本机代码(编译的二进制文件)出现了。但当然,这样的电话也可能失败。但是,我们需要一种在Java端进行通信的方法——换句话说:需要抛出一个异常

考虑到您引用的评论,这似乎很直截了当:当某些与IO相关的本机操作失败时;他们将使用该私有构造函数创建异常,然后将异常抛出给“you”。而且,本地方法可以调用方法

编辑:但是,当查看-时,确实没有关于该构造函数的任何特定内容,可以使用这个私有构造函数将创建的完全相同的消息轻松地构造这样一个异常

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

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

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

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

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


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

那么,还有什么需要进一步解释的呢?显然,他们决定Java代码不应该使用这个特定的构造函数。原因很难找到。我想他的困惑更多的是为什么它是私有的。本机方法不在这个类中,所以如果从其他类调用构造函数,它就不应该是私有的。@11维构造函数不能从其他类的一些Java代码中调用。正如javadoc所说,它是从本机代码调用的。@GhostCat我猜这是一种简化本机代码的方便方法,例如,对于您提到的空处理。另外值得注意的是,
FileNotFoundException
是自JDK1.0以来的
,但私有构造函数是自1.2以来的
。他们可能想要方便的方法,但不想要更新JavaAPI的逻辑开销,因此
private