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

问题描述:

即使状态已知,HttpURLConnection.getResponseCode()如何抛出IOException当代码已知时,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 

UPDATE 我改变了服务器端实现返回不同的状态代码(303),和它的工作现在(不扔IOException异常)。这意味着它特别与412相关。

+0

你检查什么是错的可能与服务器? http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error – Smutje

+1

你是什么意思?服务器正常工作并按预期返回412。我希望能够从连接中获取状态码,而不会引发异常。 – danieln

+1

我无法回答原因,但考虑使用更复杂的HTTP客户端。 –

注意:这可能取决于您正在运行的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) 爪哇热点(TM)64位服务器VM(建立23.21-B01,混合模式)

在Windows 64位

enter image description here

+0

我们已经检查过在之前已被删除的答案。这不应该发生。你可以自己测试一下。 –

+0

这取决于你使用的sdk ...这是来自openjdk 7.你在做什么jdk测试? –

+0

这不是我要告诉你的。使用'HttpURLConnection'向http://media.jarnbjo.de/412.php发送HTTP GET请求。你不会得到一个例外。您将获得412状态码。 –