当代码已知时,HttpURLConnection.getResponseCode()会抛出IOException

为什么即使状态已知, HttpURLConnection.getResponseCode()也会抛出IOException

 Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL:  

这不是获取响应代码的问题,因为它是在exception消息中编写的。

我希望有一个选项来获取状态代码(即使它不是〜200)而没有得到exception,所以我将能够在我的代码中决定做什么。

完整堆栈跟踪:

 Caused by: java.io.IOException: Server returned HTTP response code: 412 for 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://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection

我在http://media.jarnbjo.de/412.php上的测试使用:

Java(TM)SE运行时环境(版本1.7.0_21-b11)Java HotSpot(TM)64位服务器VM(版本23.21-b01,混合模式)

在Windows 64位上

在此处输入图像描述