web-dev-qa-db-fra.com

Comment définir une classe d'exception personnalisée en Java, le moyen le plus simple?

J'essaie de définir ma propre classe d'exception de la manière la plus simple, et voici ce que je comprends:

_public class MyException extends Exception {}

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

Voici ce que le compilateur Java dit:

_cannot find symbol: constructor MyException(Java.lang.String)
_

J'ai eu le sentiment que ce constructeur doit être hérité de Java.lang.Exception , n'est-ce pas?

277
yegor256

Non, vous n'héritez pas des constructeurs autres que ceux par défaut, vous devez définir celui qui prend une chaîne dans votre classe. Vous utilisez généralement super(message) dans votre constructeur pour appeler votre constructeur parent. Par exemple, comme ceci:

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

Une exception personnalisée typique que je définirais ressemble à ceci:

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

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

}

J'ai même créé un modèle en utilisant Eclipse afin de ne pas avoir à écrire tout le contenu encore et encore.

90
nanda

Si vous utilisez la nouvelle boîte de dialogue de classe dans Eclipse, vous pouvez simplement définir le champ Superclass sur Java.lang.Exception et cocher "Constructeurs de la superclasse" pour générer les éléments suivants:

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 réponse à la question ci-dessous sur le fait de ne pas appeler super() dans le constructeur par défaut, Oracle a ceci à dire :

Remarque: Si un constructeur n'appelle pas explicitement un constructeur de superclasse, le compilateur Java insère automatiquement un appel au constructeur sans argument. de la superclasse.

58
Kevin Brey

La raison en est expliquée dans l'article Héritage de la plate-forme Java qui dit:

"Une sous-classe hérite de tous les membres (champs, méthodes et classes imbriquées) de sa super-classe. Les constructeurs ne sont pas membres , ils ne sont donc pas hérités des sous-classes , mais le constructeur de la superclasse peut être appelé à partir de la sous-classe. "

22
Isaq
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());
        }
    }
}
19
Deepak Pakhale

La classe d'exception a deux constructeurs

  • public Exception() - Ceci crée une exception sans aucune information supplémentaire. La nature de l'exception est généralement déduite du nom de la classe.
  • public Exception(String s) - Construit une exception avec le message d'erreur spécifié. Un message de détail est une chaîne décrivant la condition d'erreur pour cette exception particulière.
2
Deepak Pakhale

Si vous héritez d'Exception, vous devez fournir un constructeur qui prend une chaîne en tant que paramètre (elle contiendra le message d'erreur).

0
vulkanino