2010-09-23 15 views
244

Ich versuche, meine eigene Exception-Klasse, der einfachste Weg, und das ist zu definieren, was ich bekomme:Wie definiert man benutzerdefinierte Ausnahmeklasse in Java, der einfachste Weg?

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

ich das Gefühl hatte:

public class MyException extends Exception {} 

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

Das, was Compiler sagt Java ist dass dieser Konstruktor von java.lang.Exception geerbt werden muss, oder?

Antwort

364

Nein, Sie "nicht erben" Nicht-Standard-Konstruktoren, müssen Sie diejenige definieren, die einen String in Ihrer Klasse nimmt. Normalerweise verwenden Sie super(message) in Ihrem Konstruktor, um den übergeordneten Konstruktor aufzurufen. Zum Beispiel wie folgt aus:

public class MyException extends Exception { 
    public MyException(String message) { 
     super(message); 
    } 
} 
+0

der Standardkonstruktor IS geerbt. – vulkanino

+53

@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 nicht den Standard, selbst wenn die Oberklasse diesen hat, und wenn Ihre Klasse keinen Konstruktor hat, erhalten Sie den Standard, selbst wenn die Oberklasse diesen nicht hat. –

+5

'Wenn Ihre Klasse keinen Konstruktor hat, erhalten Sie den Standard auch dann, wenn die Oberklasse ihn nicht hat 'Der letzte Teil ist unmöglich, außer die Oberklasse hat einen Standardkonstruktor, der für diese Klasse zugänglich ist (geschützt oder paketgeschützt) . Andernfalls müssen Sie explizit einen der übergeordneten Konstruktoren aufrufen, sonst schlägt die Kompilierung fehl. –

0

Wenn Sie von Exception erben, müssen Sie einen Konstruktor zur Verfügung stellen, die einen String als Parameter übernimmt (es wird die Fehlermeldung enthalten).

+0

Ich denke, du solltest auch Grund hinzufügen. –

+3

eigentlich, das ist falsch. Wenn Ihr Code ** einen Konstruktor mit einem String-Argument verwendet, müssen Sie ihn deklarieren. Eine Exception-Klasse ** kann jedoch ** ohne explizite Konstruktoren definiert werden, da Exception einen Konstruktor ohne Argumente hat. –

78

Eine typische benutzerdefinierte Ausnahme ich definieren würde, ist so etwas wie diese:

public class CustomException extends Exception { 

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

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

} 

ich sogar eine Vorlage erstellen, mit Eclipse so habe ich nicht die ganze Zeug über schreiben und immer wieder.

+16

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

20

Grund hierfür liegt in der Inheritance Artikel der Java-Plattform erklärt, die sagt:

„Eine Unterklasse erbt alle Mitglieder (Felder, Methoden und Klassen verschachtelt) aus seiner übergeordneten Klasse Konstrukteurs sind. nicht Mitglieder, so dass sie nicht von Unterklassen vererbt werden, aber der Konstruktor der Oberklasse kann von der Unterklasse aufgerufen werden. "

2

Exception-Klasse hat zwei Konstruktoren

  • public Exception() - Dies konstruiert eine Ausnahme ohne zusätzliche information.Nature der Ausnahme wird in der Regel aus dem Klassennamen abgeleitet.
  • public Exception(String s) - Konstruiert eine Ausnahme mit der angegebenen Fehlermeldung. Eine Detailnachricht ist ein String, der die Fehlerbedingung für diese bestimmte Ausnahme beschreibt.
+3

Seit Java 1.4 gibt es zwei weitere Konstruktoren: 'public Exception (Throwable) 'und' public Exception (String, Throwable) '. Sie werden benötigt, um [Ausnahmenverkettung] (http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html) ordnungsgemäß zu unterstützen. –

+0

@DaniloPiazzalunga stimme mit Ihnen überein. Quelle: Konstruktor Zusammenfassung http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html – KNU

18
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()); 
     } 
    } 
} 
+0

was würde das zurückgeben? – user1876508

+0

Es würde nur "Hallo wieder mit benutzerdefinierten Ausnahme" drucken, die aus dem Konstruktor für UseCusomException, die Ausnahme wäre dann im Main gefangen, die ausgedruckt würde "Dies ist meine benutzerdefinierte Ausnahme: Dies ist eine benutzerdefinierte Ausnahme". – ThePerson

51

Wenn Sie die neue Klasse Dialog in Eclipse Sie die Super Feld einfach einstellen zu java.lang.Exception und überprüfen „Konstrukteurs von Super“ und es wird erzeugen die folgende:

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 Frage nach super() im defualt Konstruktor hat Oracle this to say:

Hinweis: Wenn ein Konstruktor nicht explizit einen Oberklassenkonstruktors aufrufen, der Java-Compiler fügt automatisch einen Aufruf an den Konstruktor ohne Argumente der Oberklasse.

+0

Warum muss der Standardkonstruktor nicht 'super()' aufrufen? – ceving

+2

["Wenn der Unterklassenkonstruktor nicht angibt, welcher Superklassenkonstruktor aufgerufen werden soll, ruft der Compiler automatisch den barrierefreien Konstruktor" no-args "in der Oberklasse auf."] (Http://stackoverflow.com/a/2054040/2437516) –

Verwandte Themen