Java sun.net.www.protocol.http.HttpURLConnection.plainConnect()中的NPE
我正在开发一个在JBoss 7环境中运行的应用程序,因此必须在最大限度上使用Java 7(AFAIK JBoss 7不在Java 8+上运行,因为他们做了一些肮脏的事情,或者使用了一些从Java 7更改为8()的东西 我面临的问题是:我请求某个只支持TLSv1.2的远程https url,第一个请求成功 任何进一步的请求都会失败,但以下情况除外:Java sun.net.www.protocol.http.HttpURLConnection.plainConnect()中的NPE,java,httpconnection,Java,Httpconnection,我正在开发一个在JBoss 7环境中运行的应用程序,因此必须在最大限度上使用Java 7(AFAIK JBoss 7不在Java 8+上运行,因为他们做了一些肮脏的事情,或者使用了一些从Java 7更改为8()的东西 我面临的问题是:我请求某个只支持TLSv1.2的远程https url,第一个请求成功 任何进一步的请求都会失败,但以下情况除外: Caused by: java.lang.NullPointerException at sun.net.www.protocol.http.
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>
通常一个NPE没有那么大的问题,只需一点调试就可以帮助发现错误。然而,由于它发生在专有类(sun.net…)中,我无法获取这些类的源代码,至少在一个看起来正确的版本中是这样的(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();
}
});
代理选择器选择=
java.security.AccessController.doPrivileged(
新的java.security.PrivilegedAction(){
公共代理选择器运行(){
返回ProxySelector.getDefault();
}
});
正如我所说的,源代码关闭了,因为我找不到确切的版本,但查找与ProxySelector相关的自定义代码在很多情况下都有所帮助(在99.9%的情况下,是我们的代码导致了问题)
这仍然不能解释NPE,因为我能找到的所有版本要么设置了一些boolen标志、注释,要么处理了IOException
(catch子句或简单的rethrow),但由于移除了自定义选择器,解决了这个问题,我很高兴
我希望如果其他人遇到类似的问题,这将帮助他们省去一些麻烦。似乎是一个更接近的版本。初始化
http
,有一些复杂的逻辑,似乎并不总是成功,然后调用ps=(PrintStream)http.getOutputStream()
@yole-thx用于链接。我将其作为源代码添加到IDE中,并且能够进行调试-即使行有点关闭。结果是有人在我们的代码中设置了自定义代理选择器并删除了它,解决了问题(这又是旧的第8层问题:))。
ProxySelector sel =
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<ProxySelector>() {
public ProxySelector run() {
return ProxySelector.getDefault();
}
});