¿Cómo definir una clase de excepción personalizada en Java, la forma más fácil?

Intento definir mi propia clase de excepción de la manera más fácil, y esto es lo que obtengo:

public class MyException extends Exception {} public class Foo { public bar() throws MyException { throw new MyException("try again please"); } } 

Esto es lo que dice el comstackdor de Java:

 cannot find symbol: constructor MyException(java.lang.String) 

Tenía la sensación de que este constructor debe heredarse de java.lang.Exception , ¿no es así?

No, no “heredas” constructores no predeterminados, necesitas definir el que toma una cadena en tu clase. Normalmente usa super(message) en su constructor para invocar su constructor padre. Por ejemplo, así:

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

Una típica excepción personalizada que definiría es algo como esto:

 public class CustomException extends Exception { public CustomException(String message) { super(message); } public CustomException(String message, Throwable throwable) { super(message, throwable); } } 

Incluso creo una plantilla usando Eclipse para no tener que escribir todo una y otra vez.

Si usa el nuevo cuadro de diálogo de clase en Eclipse, puede establecer el campo de Superclase en java.lang.Exception y marcar “Constructores desde superclase” y generará lo siguiente:

 package com.example.exception; public class MyException extends Exception { public MyException() { // TODO Auto-generated constructor stub } public MyException(String message) { super(message); // TODO Auto-generated constructor stub } public MyException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } public MyException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } } 

En respuesta a la siguiente pregunta sobre no llamar a super() en el constructor defualt, Oracle tiene esto que decir :

Nota: Si un constructor no invoca explícitamente un constructor de superclase, el comstackdor de Java inserta automáticamente una llamada al constructor sin argumento de la superclase.

La razón de esto se explica en el artículo de Herencia de la Plataforma Java que dice:

“Una subclase hereda todos los miembros (campos, métodos y clases anidadas) de su superclase. Los constructores no son miembros , por lo que no son heredados por subclases, pero el constructor de la superclase puede invocarse desde la subclase”.

 package customExceptions; public class MyException extends Exception{ public MyException(String exc) { super(exc); } public String getMessage() { return super.getMessage(); } } 

 import customExceptions.MyException; public class UseCustomException { MyException newExc=new MyException("This is a custom exception"); public UseCustomException() throws MyException { System.out.println("Hello Back Again with custom exception"); throw newExc; } public static void main(String args[]) { try { UseCustomException use=new UseCustomException(); } catch(MyException myEx) { System.out.println("This is my custom exception:" + myEx.getMessage()); } } } 

La clase de excepción tiene dos constructores

  • public Exception() – Esto construye una excepción sin ninguna información adicional. La naturaleza de la excepción se infiere típicamente del nombre de la clase.
  • public Exception(String s) : crea una excepción con el mensaje de error especificado. Un mensaje de detalle es una cadena que describe la condición de error para esta excepción en particular.

Si hereda de Exception, debe proporcionar un constructor que tome una cadena como parámetro (contendrá el mensaje de error).