son sintaxis nombre lanzar hacer excepciones etiqueta directorio correctos como archivo java design exception

lanzar - el nombre de archivo el nombre de directorio o la sintaxis de la etiqueta no son correctos java



Excepciones de declarar y lanzar vs. lanzar sin declarar (5)

En el segundo método, la clase AnException debe ser una subclase de RuntimeException, lo que significa que la declaración no es obligatoria y que los llamadores del método no tienen que manejarla. Un ejemplo de RuntimeException es ArrayOutOfBoundException, imagina si hubieras manejado explícitamente la excepción (declarando un throws o con un bloque try / catch) cada vez que uses una lista.

En Java, ¿cuál es la diferencia entre los métodos gemelos?

public void methodA() throws AnException { //do something throw new AnException(); } public void methodA() { //do the same thing throw new AnException(); }

Tengo la intuición de que tiene algo que ver con ser un método bien diseñado (porque puse el método A en una interfaz, lo declaro como lo hace el método A * en su implementación y recibí una advertencia de Java de que "A * no puede anular A porque A * no arroja una excepción ").

¿Es esta especulación correcta?

¿Hay alguna otra sutil connotación en las dos formas de hacer las cosas?


Por razones puramente de documentación, es bueno que la excepción esté incluida en la definición de la función. De esta manera, es claro para quienes llaman qué excepciones deben manejarse. También estoy adivinando que el compilador necesita realizar una configuración avanzada para las funciones que generan excepciones.


Si AnException es una excepción marcada (en otras palabras, si no extiende RuntimeException) entonces methodA no compilará. Las excepciones marcadas siempre deben ser desclasificadas.

Si AnException es una excepción no verificada (si amplía RuntimeException), entonces el compilador de Java lo permite, y el tiempo de ejecución de Java lo interpreta de manera equivalente. El método A todavía es probablemente el preferido en este caso, por las razones de la documentación. El javadoc para su método mostrará que podría lanzar AnException. Es bueno que los usuarios de su método sepan qué excepciones deben esperar.


Además de las buenas respuestas dadas por otros acerca de la compilación de sus métodos por sí mismos, existe la cuestión de implementar interfaces y métodos de superposición en superclases.

La regla dice que puede anular / implementar un método, pero no puede declarar una excepción adicional a las declaradas por la firma del método original. Para entender esto, piensa en este ejemplo.

Digamos que estás usando algún tipo de estructura de datos:

public abstract class AbstractBox { public abstract void addItem(Item newItem); public abstract void removeItem(Item oldItem); }

Tiene su propia implementación, pero decide declarar excepciones que no aparecen en la firma original:

public class MyBox extends AbstractBox { public void addItem(Item newItem) throws ItemAlreadyPresentException {...} public void removeItem(Item oldItem) throws NoSuchItemException {...} }

Ahora consideremos este código genérico que maneja objetos Box y recibe una instancia de MyBox:

public void boxHandler(AbstractBox box) { Item item = new Item(); box.removeItem(item); }

Quien escribió este código no esperaba ninguna excepción, ni tenía la intención de manejar el implementador o las excepciones. Para evitar esto, el compilador no le permitirá declarar excepciones adicionales a las de la firma original.

Por supuesto, si manejas las excepciones internamente ... bueno, el compilador estará más que feliz de permitirte dejar caer las excepciones declaradas de tu firma ;-)

Espero que esto ayude...

Yuval = 8-)


El primer método debe invocarse en try catch block o en el método que declara throws AnException, de lo contrario la compilación fallará.

El segundo no tiene tal restricción