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


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 Java:

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

Tuve la sensación de que este constructor tiene que ser heredado de java.lang.Exception, ¿no lo es?

Author: SHoko, 2010-09-23

7 answers

No, no "heredas" constructores no predeterminados, necesitas definir el que toma una Cadena en tu clase. Normalmente se usa super(message) en el constructor para invocar al constructor padre. Por ejemplo, así:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
 383
Author: djna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-23 09:09:05

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 todas las cosas una y otra vez.

 88
Author: nanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-23 08:07:11

Si usas el diálogo de nueva clase en Eclipse puedes simplemente establecer el campo Superclass en java.lang.Exception y marcar "Constructores de superclass" 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 para decir :

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

 56
Author: Kevin Brey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-11 23:26:29

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

" Una subclase hereda todos los miembros (campos, métodos y anidados clases) de su superclase. Los constructores no son miembros , por lo que no son heredados por subclases, sino por el constructor de la superclase se puede invocar desde la subclase."

 20
Author: Isaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-19 04:55:47
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());
        }
    }
}
 18
Author: Deepak Pakhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 13:56:47

La clase de excepción tiene dos constructores

  • public Exception() This 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) Construc 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.
 2
Author: Deepak Pakhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 13:06:02

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

 0
Author: vulkanino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-23 07:54:55