2017-04-05 3 views
0

Ich habe eine Frage bezüglich java.lang.Exception und die Art, wie es innerhalb der throw/throws-Klauseln betrachtet wird.Ausnahme - aktiviert und deaktiviert Ausnahme-Typ

Ich habe die folgenden 2 Beispiele und ich verstehe nicht genau, wie die java.lang.Exception behandelt wird: als aktiviert oder deaktiviert Ausnahme.

Die folgende Methode erfolgreich kompiliert:

public double method1() throws Exception { 
    return 0.7; 
} 
  • hier scheint es mir, dass die java.lang.Exception bedrohen ist java.lang.RuntimeException oder java.lang.Error. Sie können angeben, dass es auch dann geworfen wird, wenn Sie nicht damit umgehen.
  • Wenn wir anstelle einer Exception eine checked exception (das sind Unterklassen von java.lang.Exception) verwenden, dann müssten Sie eine throw-Deklaration innerhalb des body der Methode haben (oder eine Methode aufrufen, die löst das hat die Ausnahme überprüft). Recht?

Die folgende nicht kompiliert:

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); 
} 
  • hier ist meine Verwirrung ... wenn es wurde java.lang eine Unterklasse von Typ java.lang.RuntimeException oder werfen. Fehler hätte es kompiliert.
  • Warum kompiliert es in diesem Fall nicht? Ich denke, es ist, weil es java.lang.Exception als eine geprüfte Ausnahme bedroht. Aber wenn es so ist, warum kompiliert method1 dann?

Danke, Luisa

+0

Mögliche Duplikat [Java: vs ungeprüfte Ausnahme Erklärung geprüft] (http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation) – Burkhard

Antwort

1

Wenn es wurde eine Unterklasse von Typ java.lang.RuntimeException oder werfen java.lang.Error es wäre zusammengestellt hatte?

Ja, RuntimeException ungeprüfte Ausnahme (oder Error), so müssen Sie nicht auf die Methode Unterschrift erklären oder catch es ausdrücklich. Wie zum Beispiel NullPointerException, können Sie nicht sagen, wann das im Code zur Laufzeit passieren könnte (dh, wegen welchem ​​Problem, also müssen Sie nicht überall im Code explizit damit umgehen), wenn es Zur Laufzeit passiert aus irgendeinem Grund die Ausnahme stacktrace.

Aber ist ein Punkt, dass, können Sie catch (wenn Sie möchten) RuntimeException (mit catch) und damit umgehen, wenn Sie mit den Dingen anders beim Anheben dieser Ausnahme behandeln wollen, Sie dazu weiter unten sehen kann.

try { 
    //some code 
} catch(ArithmeticException exe) { 
    //handle it and you can do things differently how you like 
} 

Auch gilt die gleiche Regel auch für throws auch, das heißtWenn Sie möchten, können Sie die throws (oder eine beliebige RuntimeException) auf der Methodensignatur angeben, aber es macht keinen Unterschied für den Aufrufer, eher wird es den Code überfluten und es ist NICHT die beste Praxis, die Sie suchen können here zu diesem Thema. Wenn Sie jedoch die Methodecaluse auf die Methode für die geprüfte Ausnahme festlegen, muss der Aufrufer sich damit befassen, d. H. Die Aufrufermethode muss sie explizit unter Verwendung von catch Block oder throw erneut verarbeiten.

Warum in diesem Fall wird nicht kompiliert? Ich denke, es ist, weil es java.lang.Exception als eine geprüfte Ausnahme bedroht. Aber wenn es so ist, warum kompiliert method1?

Ja, gibt es zwei Regeln für die geprüfte Ausnahmen zu tun:

(1) catch es innerhalb der Methode einen catch Block

(2) oder throw es aus dem Verfahren (unter Verwendung von throws in der Methodensignatur)

dh, wenn Ihr Codeblock throws eine überprüfte Ausnahme dann entweder müssen Sie es in der Methode abfangen oder andernfalls muss die Methode explizit deklarieren th bei ihm wirft das Exception.

0

Das Verfahren muss wie dies für die Kompilierung sein:

private void method2(int age) throws Exception 
{ 
    if (age > 30) 
     throw new Exception(); 
} 

jedoch geprüfte Ausnahmen sind eine Art und Weise können sich auf diese Ausnahme handeln, zu sein und tun etwas Sinnvolles wie Ressourcen usw. zu befreien und Sie werden wissen, Was tun Sie mit dieser Ausnahme nur, wenn Sie die tatsächliche Unterklasse von Exception werfen?

0

In method2 verpassen Sie new Schlüsselwort in Zeile

throw Exception(); 

in Java alle Ausnahmen geprüft muss mit throws Deklaration deklariert werden und unkontrolliert erklärt werden dürfen.

Geprüfte Ausnahmen sind solche, die von java.lang.Excetion Klasse geerbt wurden. Unerwartete Ausnahmen erben jedoch die Klasse java.lang.RuntimeException.

0

Mit der Throws-Klausel zum Deklarieren eines Ausnahme- und thow-Schlüsselworts wird explizit eine Ausnahme ausgelöst. So , wenn Sie schreiben

private void method2(int age) { 
    if (age > 30) 
     throw Exception(); 
} 

Sie werfen eine Ausnahme ausdrücklich, aber nicht erklärt, dass die Methode diese Ausnahme throws Klausel werfen.

Also der richtige Code wird

private void method2(int age) throws Exception { 
if (age > 30) 
    throw new Exception(); 
    } 
+0

Außer es ist nicht richtig 'zu werfen oder fangen Ausnahme ". Es ist erlaubt, aber nicht korrekt. –

1

hier scheint es mir, dass die java.lang.Exception ist java.lang.RuntimeException oder java.lang.Error bedrohen. Sie können angeben, dass es auch dann geworfen wird, wenn Sie nicht damit umgehen.

Wenn wir anstelle einer Exception eine checked exception (das sind Unterklassen von java.lang.Exception), dann müßten Sie innerhalb des Hauptteils der Methode eine throw-Deklaration haben (oder eine Methode aufrufen, die diese geprüfte Ausnahme auslöst). Recht?

Nein. Sie können angeben, dass Sie eine Ausnahme (aktiviert oder deaktiviert) werfen und keine werfen.

Dies ist beispielsweise sinnvoll, wenn die Methode in einer Unterklasse außer Kraft gesetzt wird und die Unterklasse geprüfte Ausnahmen auslösen soll. Überschreibende Methoden können nur die geprüften Ausnahmen auslösen, die die Elternklasse deklariert.

2

In erster Methode 1),

public double method1() throws Exception 
{ 
    return 0.7; 
} 

Du ausbreitende Exception [d.h. Checked Exception] zu der aufrufenden Methode, deshalb sehen Sie keine Kompilierzeitausnahme. lassen Sie mich Ihnen etwas zeigen, die Sie besser verstehen machen,

public void call() { 
    method1(); // Because method1() is propagating compile time exception you must need to handle it here. 
    } 

    public double method1() throws Exception { 
    return 0.7; 
    } 

In obigen Code, call() Sie Zeit Ausnahme erhalten kompilieren.

Bei der zweiten Methode 2)

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); //I am assuming you forgot to mention new in your code. 
} 

Sie geprüfte Ausnahme werfen, damit Sie es behandeln müssen müssen. Wenn Sie stattdessen Exception() zu RuntimeException ändern, wird kein Fehler bei der Kompilierung angezeigt. unten wie

private void method2(int age) { 
     if (age > 30) 
      throw new RuntimeException(); // you will not get compile time error. 
    } 

für mehr Details, http://technostepup.com/CoreJava/ExceptionHandling/exception-types.php

0

In Ihrem ersten Beispiel, wenn Sie diese Methode aufrufen, werden Sie die Ausnahme behandeln müssen sie wirft, weil es eine gesichtete ein ist. Wenn die Methode eine ungeprüfte Ausnahme auslöst, müssen Sie sie nicht behandeln.

Ihr zweites Beispiel kompiliert nicht, weil Sie versuchen, die ExceptionKlasse zu werfen. Sie müssen stattdessen eine Instanz davon werfen. Wenn Sie in diesem Code nur Exception zu RuntimeException oder Error oder eine Unterklasse von ihnen ändern, würde es immer noch nicht kompilieren, aus dem gleichen Grund.

Verwandte Themen