即使状态已知,HttpURLConnection.getResponseCode()
怎么会抛出IOException
?
Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL: <my url>
这不是获取响应代码的问题,因为它是在异常消息中编写的。
我希望有一个选项来获取状态代码(即使它不是〜200)而没有得到异常,所以我将能够在我的代码中决定该做什么。
完整堆栈跟踪:
Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL: <my url>
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
... my code
更新我更改了服务器端实现以返回不同的状态代码(303),它现在正在工作(不抛出IOException)。这意味着它与412具体相关。
注意:这可能取决于您运行的JVM版本!因为@SotiriosDelimanolis的测试给出了不同的结果
答案在HttpURLConnection的源代码中,并且与错误代码> 400的所有错误相关
如果错误代码等于404或410,则抛出FileNotFoundException,否则抛出IOException
if (respCode >= 400) {
if (respCode == 404 || respCode == 410) {
throw new FileNotFoundException(url.toString());
} else {
throw new java.io.IOException("Server returned HTTP" +
" response code: " + respCode + " for URL: " +
url.toString());
}
}
sun.net.www.protocol.http.HttpURLConnection第1625行的源代码:
我对http://media.jarnbjo.de/412.php的测试使用:
Java(TM)SE运行时环境(版本1.7.0_21-b11)Java HotSpot(TM)64位服务器VM(版本23.21-b01,混合模式)
在Windows 64位上
我今天在工作中遇到了同样的问题 - 我们的代码调用HttpURLConnection.getResponseCode()
并最终使用Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: ...
- 经过一段时间的JDK源代码后,我最终搞清楚以下内容:
getResponseCode()
实际上并没有抛出异常!getResponseCode()
深处抛出异常,但它被抓住了。
在它被抓住之前,一些字段被设置在HttpURLConnection
中,允许getResponseCode()
成功,它确实如此。
在它被捕获之前,异常将被保存到HttpURLConnection
子类中的字段(具体来说:sun.net.www.protocol.http.HttpURLConnection.rememberedException
)。getInputStream()
,在这种情况下应该抛出异常。 (你应该打电话给getErrorStream()
。)getInputStream()
抛出一个包含原始抛出和捕获异常的异常。Caused by
-s的堆栈跟踪,它引用了我们调用getResponseCode()
的代码行,即使我们的实际问题稍后,在我们的代码行中我们直接调用getInputStream()
。
堆栈跟踪还提到了后面的代码行,但起初我没有注意到。我打赌你的情况是一样的。