Java sun.net.www.protocol.http.HttpURLConnection.plainConnect()中的NPE

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.

我正在开发一个在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.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();
        }
      });