sun.net.www.protocol.http.HttpURLConnection.plainConnect() 中的名称
NPE in sun.net.www.protocol.http.HttpURLConnection.plainConnect()
我正在开发 运行 在 JBoss 7 环境中的应用程序,因此必须最多使用 Java 7(AFAIK JBoss 7在 Java 8+ 上没有 运行 因为他们做了一些卑鄙的把戏或使用了从 Java 7 变为 8 (source) 的东西。
我面临的问题是:我向某个仅支持 TLSv1.2 的远程 https url 发出请求,并且 first 请求成功。
任何进一步的请求都会失败,但出现以下异常:
Caused by: java.lang.NullPointerException
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:986)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at <our code>
<our code>
看起来像这样:
URL url = new URL( "https://..." );
URLConnection urlConnection = url.openConnection();
urlConnection.setUseCaches( false );
urlConnection.setRequestProperty( "User-Agent", "java.net.URLConnection/" );
//Here's where we finally get the exception
OuputStream out = urlConnection.getOutputStream();
通常 NPE 不是什么大问题,只需稍加调试就可以帮助发现错误。但是,由于它发生在专有 类(sun.net。....)我无法获得这些资源,至少不是在看起来正确的版本中(一个 version在 986 处看起来像这样:connected = true;
- 几乎不是 NPE 的来源)。
这在 Oracle JDK 1.7.0u80 和 OpenJDK 7u75 中都会发生。
有什么想法吗?
终于找到了错误,感谢@yole 的帮助。
来源不准确,所以我不能 100% 确定实际原因,但在我们的例子中,注册了一个自定义 ProxySelector
,调用此代码时似乎抛出了异常是 plainConnect()
的一部分,在第 986 行附近的某处:
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});
正如我所说,源已关闭,因为我找不到确切的版本,但寻找与自定义 ProxySelector 相关的代码有很大帮助(并且在 99.9% 的情况下,我们的代码以某种方式导致了问题) .
这仍然不能解释 NPE,因为我能找到的所有版本要么设置一些布尔标志、注释,要么处理一个 IOException
(catch 子句或简单的重新抛出)但是自从删除自定义选择器解决了我很高兴的问题。
我希望如果其他人遇到了类似的问题,这将有助于减轻他们的头痛。
我正在开发 运行 在 JBoss 7 环境中的应用程序,因此必须最多使用 Java 7(AFAIK JBoss 7在 Java 8+ 上没有 运行 因为他们做了一些卑鄙的把戏或使用了从 Java 7 变为 8 (source) 的东西。
我面临的问题是:我向某个仅支持 TLSv1.2 的远程 https url 发出请求,并且 first 请求成功。
任何进一步的请求都会失败,但出现以下异常:
Caused by: java.lang.NullPointerException
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:986)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at <our code>
<our code>
看起来像这样:
URL url = new URL( "https://..." );
URLConnection urlConnection = url.openConnection();
urlConnection.setUseCaches( false );
urlConnection.setRequestProperty( "User-Agent", "java.net.URLConnection/" );
//Here's where we finally get the exception
OuputStream out = urlConnection.getOutputStream();
通常 NPE 不是什么大问题,只需稍加调试就可以帮助发现错误。但是,由于它发生在专有 类(sun.net。....)我无法获得这些资源,至少不是在看起来正确的版本中(一个 version在 986 处看起来像这样:connected = true;
- 几乎不是 NPE 的来源)。
这在 Oracle JDK 1.7.0u80 和 OpenJDK 7u75 中都会发生。
有什么想法吗?
终于找到了错误,感谢@yole 的帮助。
来源不准确,所以我不能 100% 确定实际原因,但在我们的例子中,注册了一个自定义 ProxySelector
,调用此代码时似乎抛出了异常是 plainConnect()
的一部分,在第 986 行附近的某处:
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});
正如我所说,源已关闭,因为我找不到确切的版本,但寻找与自定义 ProxySelector 相关的代码有很大帮助(并且在 99.9% 的情况下,我们的代码以某种方式导致了问题) .
这仍然不能解释 NPE,因为我能找到的所有版本要么设置一些布尔标志、注释,要么处理一个 IOException
(catch 子句或简单的重新抛出)但是自从删除自定义选择器解决了我很高兴的问题。
我希望如果其他人遇到了类似的问题,这将有助于减轻他们的头痛。