抛出异常而不是返回。方法返回的实际类型是什么?

Throw exception instead of return. What is the actual type of method return?

提问人:Osama El-Ghonimy 提问时间:11/17/2023 最后编辑:Osama El-Ghonimy 更新时间:11/17/2023 访问量:71

问:

我正在从 Java 中的类中挖掘该方法,以找到它的实际返回类型。在 OpenJDK 中,其源代码为:openStream()URL

public final InputStream openStream() throws java.io.IOException {
    return openConnection().getInputStream();
}

返回类型显然是一个 Object,其是一个抽象类。那么,这是声明的类型,返回对象的实际类型是什么? 我遵循了返回类对象的方法。我还按照它的源代码找到了 的返回。最后,我找到了这段代码:InputStreamopenConnection()URLConnectiongetInputSteam()

public InputStream getInputStream() throws IOException {
    throw new UnknownServiceException("protocol doesn't support input");
}

我的问题是实际返回类型是什么,其中的实际返回类型是什么?getInputStream()openStream()

Java URL 返回类型

评论

2赞 rgher 11/17/2023
这回答了你的问题吗?为什么方法在抛出异常后不需要返回值?
2赞 user207421 11/17/2023
URLConnection也是一个抽象类。 继续看。
0赞 Osama El-Ghonimy 11/17/2023
@rgher谢谢。这提供了关于第一个问题的线索,我可能会挖掘更多。但第二个问题是这个问题的主题。我将删除这部分,以免被社区声明为重复。
0赞 Osama El-Ghonimy 11/17/2023
@user207421这也是一个好观点,但我不能挖掘更多。
2赞 user207421 11/17/2023
返回的实际类型取决于 的具体子类。没有一个单一的答案。URLConnection

答:

3赞 ControlAltDel 11/17/2023 #1

你知道,几年前我开始使用 Java 时(几乎)有这个确切的问题,只是我对 .java.awt.Graphics

请参阅对接口进行编程

这个想法是,你实际上不需要知道精确的类 - 任何实现接口的东西都可以换入或换出。这使得代码随着时间的推移更具适应性。

2赞 Reilas 11/17/2023 #2

"...我的问题是 getInputStream() 的实际返回类型是什么,这将是 openStream() 的实际返回类型?

下面是使用 HTTPS 地址的示例。

使用调试过程,并在 URL#openStream 方法上放置断点
而且,我的意思是实际的方法,而不是你的调用。

从这里开始,“单步执行”openConnection 方法。
然后,“单步执行”openConnection(URL) 方法。

这将转到 sun.net.www.protocol.https.Handler 类。

再次前进到 openConnection(URL, Proxy) 方法,该方法返回 sun.net.www.protocol.https.HttpsURLConnectionImpl 的新实例。

进一步遍历,您会发现通过 sun.net.www.protocol.https.DelegateHttpsURLConnection 类返回了 HttpsURLConnection 的实例。