Nunca he usado la cláusula "throws", y hoy un compañero me dijo que tenía que especificar en la declaración de método cuál excepciones que el método puede arrojar. Sin embargo, he estado usando excepciones sin problemas sin hacerlo, entonces, ¿por qué es necesario si, de hecho, se necesita?¿Qué sucede si un método arroja una excepción que no se especificó en la declaración de método con "throws"
Respuesta
Java tiene dos tipos diferentes de excepciones: comprobado Excepciones y sin marcar excepciones.
Las excepciones no comprobadas son subclases de RuntimeException
y no es necesario agregar una declaración de tiradas. Todas las demás excepciones deben manejarse en el cuerpo del método, ya sea con una instrucción try/catch o con una declaración throws.
Ejemplo de excepciones sin marcar: IllegalArgumentException
que se utiliza a veces para notificar que se ha llamado a un método con argumentos ilegales. No se necesitan lanzamientos.
Ejemplo de excepciones marcadas: IOException
que pueden arrojar algunos métodos del paquete java.io
. Utilice un try/catch o agregue throws IOException
a la declaración del método y delegue el manejo de la excepción al llamador del método.
'arroja' palabra clave helos para delegar el manejo de excepciones a otros componentes. Vea la demostración de video: http://www.bitspedia.com/2013/11/how-to-delegate-exception-handling.html –
- Debe declarar las excepciones comprobadas que arroja su método.
- Si declara 'throws Exception' que prácticamente cubre la mayoría, si no todas las excepciones marcadas
- Siempre puede lanzar una excepción de tiempo de ejecución no comprobada y no tener que declarar.
Estoy bastante seguro de si intenta lanzar una excepción marcada, y no ha declarado el método como arrojar ese tipo, el código ni siquiera compila (verificando ahora).
editar, haga lo que si intenta algo tan simple como
public static void main(String[] args) {
throw new Exception("bad");
}
se obtiene un error de compilación.
Específicamente para su pregunta, si invoca un método que se declara para lanzar Exception (s), debe intentar/atrapar la invocación del método o declarar que su método arroja las excepciones.
El problema era que no sabía que había excepciones marcadas y no marcadas. Aceptaría tu respuesta si no fuera porque Andreas_D me dio la respuesta perfecta. ¡Gracias! – bluehallu
Si se declara un método con la palabra clave throws, cualquier otro método que desee llamar a ese método debe estar preparado para detectarlo o declarar que lanzará una excepción.
Por ejemplo, si desea detener la aplicación debe llamar Thread.sleep(milliseconds);
Pero la declaración de este método dice que va a lanzar una Declaración InterruptedException
:
public static void sleep(long millis) throws InterruptedException
Así Si desea llamarlo, por ejemplo, en su método principal, debe capturarlo:
public static void main(String args[]) {
try {
Thread.sleep(1000);
} catch(InterruptedException ie) {
System.out.println("Opps!");
}
}
O hacer que el método también declarar que está lanzando una excepción:
public static void main(String args[]) throws InterruptedException {
Thread.sleep(1000);
}
en su último ejemplo, ¿cómo atrapo la excepción? –
@somefolk En mi último ejemplo, el programa no detectará la 'InterruptedException' porque' throws' está en la función 'main()'. Si ocurre uno, el programa terminará abruptamente. – Anton
Puede ocurrir, incluso con comprobado excepciones. Y a veces puede romper el registro.
Supongamos que un método de biblioteca utiliza este truco para permitir una implementación de Runnable
que puede lanzar IOException
:
class SneakyThrowTask implements Runnable {
public void run() {
throwSneakily(new IOException());
}
private static RuntimeException throwSneakily(Throwable ex) {
return unsafeCastAndRethrow(ex);
}
@SuppressWarnings("unchecked")
private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
throw (X) ex;
}
}
Y que lo llaman así:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
}
}
La excepción no se registrarán. Y como es una excepción comprobada, no puede escribir esto:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
} catch (IOException ex) {
LOGGER.log(ex); // Error: unreachable code
}
}
¿Pero alguna vez escribirías tal código? Me preguntaba en qué situación podría uno querer escribir ese código – Sameer
- 1. ¿Qué sucede si un bloque finally arroja una excepción?
- 2. ¿Qué sucede cuando un hilo arroja una excepción?
- 3. declara que un método siempre arroja una excepción?
- 4. ¿Qué sucede cuando un subproceso de .NET arroja una excepción?
- 5. Cuándo utilizar throws en una declaración de método Java?
- 6. El método JAXB XMLAdapter no arroja la excepción
- 7. ¿Por qué el '{' arroja una NullReferenceException en un método estático?
- 8. Método de ofuscación con la cláusula throws
- 9. ¿Qué sucede cuando lanzo una excepción de C++ desde un método nativo de Java?
- 10. ¿Qué sucede con una consulta si se agota el tiempo?
- 11. ¿Cómo puedo afirmar que un método asíncrono C# arroja una excepción en una prueba unitaria?
- 12. ¿Cómo invocar un método que arroja una excepción utilizando la reflexión de Java?
- 13. ¿Qué sucede si se lanza una excepción durante finalize()
- 14. ¿Qué sucede si se lanza una excepción no controlada en Application_Start?
- 15. En Java, ¿qué sucede cuando tienes un método con una palabra clave de visibilidad no especificada?
- 16. Método de declaración para generar una excepción y una subclase de esta excepción
- 17. ¿Qué sucede si dos categorías ObjC anulan el mismo método?
- 18. ¿Qué sucede con el destructor de la clase base si un destructor de clase derivado lanza una excepción?
- 19. Prueba si la propiedad arroja una excepción con nunit
- 20. Regex que coincidirá con una declaración de método Java
- 21. ¿Por qué XmlSerializer.Deserialize arroja una excepción System.IO.FileLoadException?
- 22. método readobject arroja ClassNotFoundException
- 23. ¿Qué sucede si un tiro? declaración se ejecuta fuera del bloque de captura?
- 24. BeginInvoke arroja la excepción
- 25. ¿Qué sucede si un hilo se cuelga en un proceso?
- 26. Determinar si un método llama a un método en otro ensamblado que contiene una nueva declaración y viceversa
- 27. ¿Qué sucede cuando llamas a un método estático en C#?
- 28. Eficiencia de la excepción cuando no se arroja nada
- 29. Java finalmente bloquea y arroja excepción en el nivel de método
- 30. Java - comprobación si parseInt arroja la excepción
Solo tiene que especificar las excepciones que están marcadas (y eso es realmente molesto). Cuando no lo haces, el compilador debería quejarse. –
He votado a favor de dejar esta pregunta abierta porque ella y las respuestas ofrecen una buena cobertura de ** throw ** con excepciones ** checked ** y ** desactivadas **. – AdrianHHH