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

时间:2018-08-02 15:53:51

标签: java httpconnection

我正在一个在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中都会发生这种情况。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后,由于@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%的情况下,是由我们的代码以某种方式引起了问题)。 / p>

那仍然不能解释NPE,因为我可以找到的所有版本都设置了布尔标志,注释或处理了IOException(无论是克劳斯句还是简单的重新抛出),但是因为删除了自定义选择器解决了我很高兴的问题。

我希望如果其他任何人在类似问题上迷失了方向,这将有助于他们避免头痛。