Wie definiere ich eine benutzerdefinierte Ausnahmeklasse in Java am einfachsten?

286

Ich versuche, meine eigene Ausnahmeklasse auf einfachste Weise zu definieren, und das bekomme ich:

public class MyException extends Exception {}

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

Dies sagt der Java-Compiler:

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

Ich hatte das Gefühl, dass dieser Konstruktor geerbt werden muss java.lang.Exception, nicht wahr?

yegor256
quelle

Antworten:

402

Nein, Sie "erben" keine nicht standardmäßigen Konstruktoren, sondern müssen den definieren, der einen String in Ihrer Klasse verwendet. Normalerweise verwenden Sie super(message)in Ihrem Konstruktor, um Ihren übergeordneten Konstruktor aufzurufen. Zum Beispiel so:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
djna
quelle
58
@vulkanino: Nein. Der Standardkonstruktor wird vom Compiler für jede Klasse hinzugefügt, die keinen eigenen Konstruktor definiert. Wenn Sie einen expliziten Konstruktor definieren, erhalten Sie den Standard nicht, selbst wenn die Oberklasse ihn hat, und wenn Ihre Klasse keinen Konstruktor hat, erhalten Sie den Standard, auch wenn die Oberklasse ihn nicht hat.
Michael Borgwardt
5
if your class has no constructor, you get the default even if the superclass does not have itDer letzte Teil ist nicht möglich, es sei denn, die Oberklasse verfügt über einen Standardkonstruktor, auf den diese Klasse zugreifen kann (möglicherweise geschützt oder paketgeschützt). Andernfalls müssen Sie explizit einen der übergeordneten Konstruktoren aufrufen, da sonst die Kompilierung fehlschlägt.
Sean Patrick Floyd
43
Bitte fügen Sie die MyException(Throwable)und MyException(String, Throwable)Konstrukteuren richtig Unterstützung Ausnahmen verketten .
Danilo Piazzalunga
8
Fast 3 Jahre später wurde keiner der zusätzlichen Konstruktoren hinzugefügt. :(
byxor
2
@BrandonIbbotson Was meinst du mit "sie" und wo werden sie hinzugefügt? Wenn das, was Sie mit "sie" gemeint haben, Konstruktoren der Oberklasse und mit "wo" die Unterklasse ist, dann liegen Sie falsch. Superklassenkonstruktoren werden der Unterklasse nicht implizit hinzugefügt. Außerdem kann ich in den vorherigen Sätzen kein anderes Thema sehen, auf das sich diese Wörter beziehen.
Halil
90

Eine typische benutzerdefinierte Ausnahme, die ich definieren würde, ist ungefähr so:

public class CustomException extends Exception {

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

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

}

Ich erstelle sogar eine Vorlage mit Eclipse, damit ich nicht immer wieder alles schreiben muss.

Nanda
quelle
17
Sie können Exception einfach erweitern, wenn Sie Ihre Klasse in Eclipse erstellen, und Sie erhalten alle vier Konstruktoren. Sie benötigen keine Vorlage.
Jeremyjjbrown
Wann sollten wir den zweiten Consutructor anstelle des ersten verwenden?
ZhaoGang
61

Wenn Sie das neue Klassendialogfeld in Eclipse verwenden, können Sie das Feld java.lang.ExceptionSuperklasse einfach auf "Konstruktoren aus Superklasse" setzen und aktivieren. Daraufhin wird Folgendes generiert:

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
    }

}

Als Antwort auf die folgende Frage, super()ob der defualt-Konstruktor nicht aufgerufen werden soll, hat Oracle Folgendes zu sagen :

Hinweis: Wenn ein Konstruktor einen Superklassenkonstruktor nicht explizit aufruft, fügt der Java-Compiler automatisch einen Aufruf an den Konstruktor ohne Argumente der Superklasse ein.

Kevin Brey
quelle
22

Der Grund hierfür wird im Vererbungsartikel der Java-Plattform erläutert, in dem es heißt:

"Eine Unterklasse erbt alle Mitglieder (Felder, Methoden und verschachtelte Klassen) von ihrer Oberklasse. Konstruktoren sind keine Mitglieder , daher werden sie nicht von Unterklassen geerbt, aber der Konstruktor der Oberklasse kann von der Unterklasse aufgerufen werden."

Isaq
quelle
19
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());
        }
    }
}
Deepak Pakhale
quelle
Was würde das zurückbringen?
user1876508
Es würde nur "Hallo zurück mit benutzerdefinierter Ausnahme" ausdrucken, das vom Konstruktor für UseCusomException stammt. Die Ausnahme würde ausgelöst und dann in der Hauptausgabe abgefangen, die "Dies ist meine benutzerdefinierte Ausnahme: Dies ist eine benutzerdefinierte Ausnahme" ausgibt.
ThePerson
2

Die Ausnahmeklasse hat zwei Konstruktoren

  • public Exception() - Dadurch wird eine Ausnahme ohne zusätzliche Informationen erstellt. Die Art der Ausnahme wird normalerweise aus dem Klassennamen abgeleitet.
  • public Exception(String s) - Erstellt eine Ausnahme mit der angegebenen Fehlermeldung. Eine Detailmeldung ist eine Zeichenfolge, die die Fehlerbedingung für diese bestimmte Ausnahme beschreibt.
Deepak Pakhale
quelle
3
Tatsächlich gibt es seit Java 1.4 zwei weitere Konstruktoren: public Exception(Throwable)und public Exception(String, Throwable). Sie werden benötigt, um die Verkettung von Ausnahmen ordnungsgemäß zu unterstützen .
Danilo Piazzalunga
@ DaniloPiazzalunga stimme dir zu. Quelle: Konstruktorübersicht docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html
KNU
0

Wenn Sie von Exception erben, müssen Sie einen Konstruktor angeben, der einen String als Parameter verwendet (er enthält die Fehlermeldung).

Vulkanino
quelle
Ich denke, Sie sollten auch Grund hinzufügen.
Jigar Joshi
3
eigentlich ist das falsch. Wenn Ihr Code verwendet einen Konstruktor mit einem String - Argumente, dann muss man es erklären. Eine Exception-Unterklasse kann jedoch ohne explizite Konstruktoren definiert werden, da Exception einen Konstruktor ohne Argumente hat.
Stephen C
0

und vergessen Sie nicht, wie Sie am einfachsten eine Ausnahme auslösen können (Sie müssen keine Klasse erstellen).

if (rgb > MAX) throw new RuntimeException("max color exceeded");
Lorne K.
quelle