【问题标题】:NPE in sun.net.www.protocol.http.HttpURLConnection.plainConnect()sun.net.www.protocol.http.HttpURLConnection.plainConnect() 中的 NPE
【发布时间】:2018-08-02 15:53:51
【问题描述】:

我正在开发一个在 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>

&lt;our code&gt; 看起来像这样:

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:@ 987654327@ - 几乎不是 NPE 的来源)。

这发生在 Oracle JDK 1.7.0u80 和 OpenJDK 7u75 中。

有什么想法吗?

【问题讨论】:

  • This 似乎是一个更接近的版本。初始化http有一些复杂的逻辑,似乎并不总是成功,接着调用ps = (PrintStream)http.getOutputStream();
  • @yole 感谢链接。我将它作为源代码添加到我的 IDE 中,并且能够进行调试——即使线路有些偏离。原来有人在我们的代码中设置了一个自定义代理选择器并删除它解决了问题(这又是旧的第 8 层问题:))。

标签: java httpconnection


【解决方案1】:

感谢@yole的帮助,终于找到了错误。

来源不准确,因此我不能 100% 确定实际原因,但在我们的案例中,注册了一个自定义 ProxySelector,并且在调用此代码时似乎已抛出异常,这是 @ 的一部分987654322@ 和第 986 行附近的某处:

  ProxySelector sel =
    java.security.AccessController.doPrivileged(
      new java.security.PrivilegedAction<ProxySelector>() {
        public ProxySelector run() {
          return ProxySelector.getDefault();
        }
      });

正如我所说,由于我找不到确切的版本,所以源代码已关闭,但寻找自定义 ProxySelector 相关代码有很大帮助(在 99.9% 的情况下,是我们的代码以某种方式导致了问题)。

这仍然不能解释 NPE,因为我能找到的所有版本要么设置一些布尔标志、cmets 或处理 IOException(catch 子句或简单的重新抛出),但由于删除自定义选择器解决了问题我很高兴。

我希望如果其他人遇到类似的问题,这将有助于他们省去一些麻烦。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多