2012-05-13 17 views
11

¿Por qué debo envolver mis excepciones personalizadas lanzadas con try/catch al intentar lanzarlas, pero no tengo que hacer eso para excepciones genéricas? Al igual que en el ejemplo, mi Exception subclase:Lanzar excepciones personalizadas en Java

public class MyException extends Exception { 
    public MyException(String msg) { 
     super(msg); 
    } 
} 

excepciones que lanzan:

public class Exe { 

    private static void testex(String test) { 
     if (null!=test) { 
      throw new UnsupportedAddressTypeException(); 
     } else {//Removing try/catch block results in compile failure 
      try { 
      throw new MyException("message"); 
      } catch (MyException e) { 
      e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

Consulte [Excepciones sin marcar] (http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) en el tutorial de Java. – McDowell

Respuesta

15

UnsupportedAddressTypeException es una subclase de RuntimeException, y desde el JavaDoc:

RuntimeException es la superclase de esas excepciones que puede lanzarse durante el funcionamiento normal de la Máquina Virtual Java.

No se requiere un método para declarar en su cláusula throws ninguna subclase de RuntimeException que pueda arrojarse durante la ejecución del método pero que no sea capturada.

+0

Ah, creo que de hecho adivinaste lo que preguntaba el interrogador ... Me centré en la pregunta "¿por qué me hace atrapar mi propia excepción?", En lugar de la distinción entre comprobado vs. no verificado. – andersoj

7

Su método estático debe declarar

private static void testex(String test) throws MyException 

si desea que el método para tirarlo (y no a atrapar y manejarlo internamente).

12

Si su excepción extiende java.lang.Exception, debe atraparla (o volver a lanzarla). Si amplía java.lang.RuntimeException, no es necesario que lo haga. Descubrirá que esto también se aplica a todas las excepciones estándar.

edición cambió las palabras no debe a no está obligado a

+0

Si se extiende 'RuntimeException', no es * obligatorio * capturar, pero puede hacerlo. – andersoj

+0

Es cierto. "no debe" fue una mala elección de palabras. Un problema de langugage ... –

0

Desde el Java Tutorial:

Válido código de lenguaje de programación Java debe respetar la captura o Especificar Requisito. Esto significa que el código que podría arrojar ciertas excepciones deben estar encerrados por cualquiera de los siguientes:

  • Una declaración try que detecta la excepción. La prueba debe proporcionar un controlador para la excepción, como se describe en Catching and Handling Exceptions.

  • Método que especifica que puede lanzar la excepción. El método debe proporcionar una cláusula throws que liste la excepción, como se describe en Especificando las excepciones lanzadas por un método.

código que no cumple con la captura o especificar requisito no compilación. No todas las excepciones están sujetas al requisito de captura o especificación.

[...]

excepciones de tiempo de ejecución no están sujetos a la captura o especificar Requisito. Las excepciones de tiempo de ejecución son las indicadas por RuntimeException y sus subclases.

Cuestiones relacionadas