代码之家  ›  专栏  ›  技术社区  ›  Thomas

sun.net.www.protocol.http.httpurlconnection.plainconnect()中的NPE

  •  2
  • Thomas  · 技术社区  · 7 年前

    我正在研究一个在JBase7环境中运行的应用程序,因此在MAX上必然要使用Java 7(AFAIK JBASE 7不运行在Java 8 +上),因为它们做了一些肮脏的把戏或者使用了从Java 7变为8的东西。 source )。

    我面临的问题是:我对一些只支持tlsv1.2和 第一 请求成功。

    但是,任何进一步的请求都失败,但有以下例外:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Thomas    7 年前

    在@yole的帮助下,终于找到了错误。

    资料来源不准确,所以我不能百分之百确定实际原因,但在我们的案例中有一个惯例 ProxySelector 已注册,并且在调用作为 plainConnect() 在986号线附近:

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

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

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

    我希望如果其他人也遇到类似的问题,这将帮助他们减轻一些头痛。

    推荐文章