Reputation: 4973
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.
Upvotes: 18
Views: 13233
Reputation: 101
What these other responses seem to miss, is that -- at least on my JDK -- what happens is that getResponseCode()
does NOT throw exception but it sure looks like it DOES.
What actually happened to me -- I invoked getResponseCode()
(which did not throw the exception) and then I invoked connection.getInputStream()
connection.getInputStream()
does throw an exception -- which it should (by spec) -- BUT IT ADDS the exception stack trace for where you called getResponseCode()
as the 'cause' -- i.e. if you look at the stack trace it looks something like this:
...
... 20 common frames omitted
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://localhost:8080/system
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1924)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520)
at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
at yourpackage.yourcode.**YourClass.yourMethod**([line number where you invoked getResponseCode()]
... 22 common frames omitted
So, like I said, getResponseCode()
does not throw exception, but SURE LOOKS like it does. Beware.
Upvotes: 0
Reputation: 183191
I encountered the same problem today at work — our code was calling HttpURLConnection.getResponseCode()
and ending up with Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: ...
— and after some quality time diving through the JDK source code, I ended up figuring out the following:
getResponseCode()
isn't actually throwing an exception!getResponseCode()
, but it gets caught.
HttpURLConnection
that allow getResponseCode()
to succeed, which it does.HttpURLConnection
(specifically: sun.net.www.protocol.http.HttpURLConnection.rememberedException
).getInputStream()
directly, which is supposed to throw an exception in this case. (You're supposed to call getErrorStream()
instead.)getInputStream()
throws an exception that wraps the original thrown-and-caught exception.Caused by
-s that referred to our line of code where we were calling getResponseCode()
, even though our actual issue was later, in our line of code where we were calling getInputStream()
directly.
I'm betting that your case was the same.
Upvotes: 9
Reputation: 777
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:
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
Upvotes: 8