tipos - ¿Cómo definir la clase de excepción personalizada en Java, la forma más fácil?
tipos de excepciones en programacion (7)
Estoy tratando de definir mi propia clase de excepción de la manera más fácil, y esto es lo que estoy obteniendo:
public class MyException extends Exception {}
public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}
Esto es lo que dice el compilador de Java:
cannot find symbol: constructor MyException(java.lang.String)
Tenía la sensación de que este constructor tiene que ser heredado de java.lang.Exception
, ¿no es así?
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 generalmente se deduce del nombre de la clase. -
public Exception(String s)
: construye una excepción con un mensaje de error especificado. Un mensaje de detalle es una cadena que describe la condición de error para esta excepción en particular.
La razón de esto se explica en el artículo de Inheritance 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 las subclases, pero el constructor de la superclase puede invocarse desde la subclase".
No, usted no "hereda" a los constructores no predeterminados, necesita definir el que toma un String en su clase. Normalmente, utiliza super(message)
en su constructor para invocar su constructor principal. Por ejemplo, como este:
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
Si hereda de Exception, debe proporcionar un constructor que tome una cadena como parámetro (contendrá el mensaje de error).
Si usa el nuevo cuadro de diálogo de clase en Eclipse, simplemente puede configurar el campo Superclase en java.lang.Exception
y verificar "Constructores de 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 pregunta a continuación sobre no llamar a super()
en el constructor defualt, Oracle tiene esto para decir :
Nota: Si un constructor no invoca explícitamente un constructor de superclase, el compilador de Java inserta automáticamente una llamada al constructor sin argumentos de la superclase.
Una excepción personalizada típica 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 el material una y otra vez.
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());
}
}
}