Al fin luego de tanto trabajar ya hallamos el arreglo de este conflicto que ciertos lectores de este sitio han presentado. Si quieres compartir algo más no dudes en compartir tu conocimiento.
ATENCIÓN: ¡esto puede depender de la versión de JVM que esté ejecutando! como pruebas de @SotiriosDelimanolis dieron resultados diferentes
La respuesta está en el código fuente de HttpURLConnection y está relacionada con todos los errores que tienen código de error > 400
Si el código de error es igual a 404 o 410, se lanza una excepción FileNotFoundException; de lo contrario, una IOException como
if (respCode >= 400) 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 Código fuente en la línea 1625:
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection
Mi prueba en http://media.jarnbjo.de/412.php usando:
Java(TM) SE Runtime Environment (compilación 1.7.0_21-b11) Java HotSpot(TM) Servidor virtual de 64 bits (compilación 23.21-b01, mixed modo)
en Windows de 64 bits
Encontré el mismo problema hoy en el trabajo: nuestro código estaba llamando HttpURLConnection.getResponseCode()
y terminando con Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: ...
— y después de un tiempo de calidad buceando a través del código fuente de JDK, terminé descifrando lo siguiente:
getResponseCode()
no es en realidad lanzando una excepción!- Se lanza una excepción desde muy adentro
getResponseCode()
pero se atrapa.- Antes de que se atrape, algunos campos se establecen dentro
HttpURLConnection
eso permitegetResponseCode()
para tener éxito, lo que hace. - Además, antes de que se detecte, la excepción se guarda en un campo en una subclase de
HttpURLConnection
(específicamente:sun.net.www.protocol.http.HttpURLConnection.rememberedException
).
- Antes de que se atrape, algunos campos se establecen dentro
- Posteriormente, nuestro código llamado
getInputStream()
directamente, que es supuesto para lanzar una excepción en este caso. (Se supone que debes llamargetErrorStream()
en lugar de.) getInputStream()
lanza una excepción que envuelve la excepción original lanzada y atrapada.- Así que terminamos obteniendo un stacktrace con
Caused by
-s que se refería a nuestra línea de código donde estábamos llamandogetResponseCode()
a pesar de que nuestro problema real fue posterior, en nuestra línea de código donde estábamos llamandogetInputStream()
directamente.- el seguimiento de la pila además menciona esa línea de código posterior, pero no me di cuenta de eso al principio.
Apuesto a que tu caso fue el mismo.
Si sostienes alguna desconfianza y capacidad de avanzar nuestro escrito te insinuamos ejecutar una disquisición y con placer lo interpretaremos.