Search code examples
javahttpurlconnection

HttpURLConnection.getResponseCode() throws IOException when code is known


How come HttpURLConnection.getResponseCode() throws IOException even if the status is known?

Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL: <my url>

It's not a problem of getting the response code because it is written in the exception message.

I would expect to have an option to get the status code (even if it's not ~200) without getting an exception, so I'll be able to decide in my code what to do.

Full stack trace:

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 I changed the server side implementation to return a different status code (303), and it's working now (not throwing IOException). Meaning it is specifically related to 412.


Solution

  • ATTENTION: this may depend on the JVM version you are running!!! as tests of @SotiriosDelimanolis gave different results

    The answer is in the source code of the HttpURLConnection and is related to all the errors that have error code > 400

    If error code is equal 404 or 410 a FileNotFoundException is thrown else an IOException as

        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 Source code at line 1625:

    http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection

    My test on http://media.jarnbjo.de/412.php using :

    Java(TM) SE Runtime Environment (build 1.7.0_21-b11) Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

    on Windows 64 bit

    enter image description here