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 子句或简单的重新抛出)但是自从删除自定义选择器解决了我很高兴的问题。

我希望如果其他人遇到了类似的问题,这将有助于减轻他们的头痛。