2012-05-13 11 views
11

Warum muss ich meine ausgelösten benutzerdefinierten Ausnahmen mit try/catch umbrechen, während ich versuche, sie zu werfen, aber ich muss das nicht für generische Ausnahmen tun? Wie im Beispiel meine Exception Unterklasse:Benutzerdefinierte Ausnahmen in Java werfen

public class MyException extends Exception { 
    public MyException(String msg) { 
     super(msg); 
    } 
} 

Werfen Ausnahmen:

public class Exe { 

    private static void testex(String test) { 
     if (null!=test) { 
      throw new UnsupportedAddressTypeException(); 
     } else {//Removing try/catch block results in compile failure 
      try { 
      throw new MyException("message"); 
      } catch (MyException e) { 
      e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

Siehe [Ungeprüfte Ausnahmen] (http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) im Java-Lernprogramm. – McDowell

Antwort

15

UnsupportedAddressTypeException eine Unterklasse von Runtime ist, und aus der JavaDoc:

Runtime ist die übergeordnete Klasse jener Ausnahmen, die kann während des normalen Betriebs der Java Virtual Machine ausgelöst werden.

Eine Methode ist nicht erforderlich, um in ihrer throws-Klausel Unterklassen von RuntimeException zu deklarieren, die während der Ausführung der Methode ausgelöst, aber nicht abgefangen werden.

+0

Ah, ich denke, Sie haben tatsächlich geahnt, was der Fragesteller gefragt hat ... Ich konzentrierte mich auf die Frage "Warum bringt mich das meine eigene Ausnahme?" Und nicht auf die Unterscheidung zwischen überprüft und nicht geprüft. – andersoj

7

Ihre statische Methode sollte erklären

private static void testex(String test) throws MyException 

, wenn Sie die Methode wollen sie werfen (und nicht an fangen und handle es intern).

12

Wenn Ihre Ausnahme java.lang.Exception erweitert, müssen Sie sie abfangen (oder erneut ausführen). Wenn Sie java.lang.RuntimeException erweitern, müssen Sie dies nicht tun. Sie werden feststellen, dass dies auch für alle Standardausnahmen gilt.

bearbeiten die Worte geändert darf nicht zu nicht erforderlich ist, um

+0

Wenn es 'RuntimeException' erweitert, müssen Sie * nicht * fangen, aber Sie können das ganz einfach tun. – andersoj

+0

Wahr. "Muss nicht" war eine schlechte Wortwahl. Ein Problem mit der Sprache ... –

0

Vom Java Tutorial:

Valid Java-Code Programmiersprache müssen den Fang einlöst oder Anforderung angeben. Dies bedeutet, dass Code, der bestimmte Ausnahmen auslösen könnte muss durch eine der folgenden eingeschlossen sein:

  • Eine try-Anweisung, die die Ausnahme abfängt. Der try muss einen Handler für die Ausnahme bereitstellen, wie in Ausnahmen und Ausnahmen von Catching and Handling beschrieben.

  • Eine Methode, die angibt, dass die Ausnahme ausgelöst werden kann. Die Methode muss eine throws-Klausel bereitstellen, die die Ausnahme auflistet, wie in Angeben der von einer Methode ausgelösten Ausnahmen beschrieben.

-Code, der den Fang oder angeben Anforderung wird nicht Kompilierung nicht nachkommt. Nicht alle Ausnahmen unterliegen der Anforderung "Catch" oder "Specify".

[...]

Runtime Ausnahmen unterliegen nicht den Fang oder Anforderung angeben. Laufzeitausnahmen sind diejenigen, die von RuntimeException und ihren Unterklassen angegeben werden.

Verwandte Themen