我正在一个在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中都会发生这种情况。
有什么想法吗?
答案 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
(无论是克劳斯句还是简单的重新抛出),但是因为删除了自定义选择器解决了我很高兴的问题。
我希望如果其他任何人在类似问题上迷失了方向,这将有助于他们避免头痛。