it-swarm.com.de

Wie definiere ich eine benutzerdefinierte Ausnahmeklasse in Java?

Ich versuche, meine eigene Ausnahmeklasse auf einfachste Weise zu definieren, und dies erhalte ich:

_public class MyException extends Exception {}

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

Das sagt der Java Compiler:

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

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

277
yegor256

Nein, Sie "erben" keine Nicht-Standardkonstruktoren. Sie müssen denjenigen 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);
    }
}
395
djna

Eine typische benutzerdefinierte Ausnahme, die ich definieren würde, sieht folgendermaßen aus:

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.

90
nanda

Wenn Sie das neue Klassendialogfeld in Eclipse verwenden, können Sie das Feld Superklasse einfach auf Java.lang.Exception setzen und "Konstruktoren aus Superklasse" aktivieren. Dadurch 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, ob im defualt-Konstruktor super() nicht aufgerufen werden soll, hat Oracle dies zu sagen :

Hinweis: Wenn ein Konstruktor einen Superklassenkonstruktor nicht explizit aufruft, fügt der Compiler Java automatisch einen Aufruf des Konstruktors ohne Argument ein der Oberklasse.

58
Kevin Brey

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

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

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

Ausnahmeklasse hat zwei Konstruktoren

  • public Exception() - Erstellt eine Ausnahme ohne zusätzliche Informationen. Die Art der Ausnahme wird normalerweise aus dem Klassennamen abgeleitet.
  • public Exception(String s) - Erstellt eine Ausnahme mit der angegebenen Fehlermeldung. Eine detaillierte Nachricht ist eine Zeichenfolge, die die Fehlerbedingung für diese bestimmte Ausnahme beschreibt.
2
Deepak Pakhale

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

0
vulkanino