2016-05-12 9 views
4

Ich bin heute in Java auf ein komisches Szenario gestoßen, während ich programmiert habe. Ich habe einen try..catch-Block in meiner Methode, die keine throws-Klausel hat und ich bin in der Lage, das Ausnahmeobjekt zu werfen, das im catch-Block gefangen wurde. Es ist ein Objekt der Exception-Klasse, daher ist es keine ungeprüfte Ausnahme. Außerdem wird der Stacktrace nicht gedruckt, wenn eine Ausnahme auftritt, die Exception gerade verschluckt wird.JDK 1.7 weiter, das Werfen eines Ausnahmeobjekts von catch block erfordert keine throws-Klausel !!! Warum ist das so?

Im Folgenden mein Codebeispiel ist,

public class ExceptionTest { 

    public void test() { 
     try 
     { 
      // Some code which may throw exception. 
     } 
     catch(Exception ex) 
     { 
      // Compiler should ask me to have a *throws Exception* in the signature, when I am throwing an exception object. 
      throw ex; 
     } 
    } 

} 

Allerdings, wenn ich Objekt eine neue Ausnahme statt der gefangenen Ausnahmeobjekts werfe, Compiler fragen mich, eine Klausel in der Methodensignatur haben, wirft.

N.B: I am facing this situation when running in Java 7 or 8.

Ich wundere mich, wohin wird das geworfene Objekt gehen? Jeder mit einer Idee auf diese bitte ...

+0

Verwandte auch http://stackoverflow.com/questions/35184092/why-is-catching-checked-exceptions-allowed-for-code-that-does-not-throw-exceptio – Tunaki

Antwort

12

Sie sehen dies, wenn der Code in try Block keine überprüfte Ausnahme werfen kann. An diesem Punkt weiß der Compiler, dass die einzige Art von Ausnahme, die durch den Block catch abgefangen wird, eine nicht geprüfte Ausnahme sein muss, und daher kann sie erneut ausgelöst werden. Beachten Sie, dass, wenn Sie einen anderen Wert ex im catch Block zugewiesen, würde der Compiler nicht mehr in der Lage sein, diese Gewissheit zu haben. Im Moment ist exeffektiv endgültig.

Wenn Sie versuchen, eine Anweisung aufzurufen, die eine überprüfte Ausnahme innerhalb des Blocks try auslöst, wird der Code nicht wie erwartet kompiliert.

Zum Beispiel:

public class ExceptionTest { 

    public void test() { 
     try { 
      foo(); 
     } catch(Exception ex) { 
      throw ex; 
     } 
    } 

    public void foo() throws java.io.IOException { 
    } 
} 

Gibt einen Fehler aus:

ExceptionTest.java:12: error: unreported exception IOException; must be caught or declared to be thrown 
     throw ex; 
     ^

Was, wo die Ausnahme "geht" - wenn der Code im try-Block eine ungeprüfte Ausnahme auslöst, wird es vermehrt wie normal. Versuchen Sie diese:

public class ExceptionTest { 

    public static void main(String[] args) { 
     test(); 
    } 

    public static void test() { 
     try { 
      String x = null; 
      x.length(); 
     } catch(Exception ex) { 
      throw ex; 
     } 
    } 
} 

Lauf, die die folgende Ausgabe gibt, wie erwartet:

Exception in thread "main" java.lang.NullPointerException 
     at ExceptionTest.test(ExceptionTest.java:10) 
     at ExceptionTest.main(ExceptionTest.java:4) 

JLS 11.2.2 Dokumente, welche eine Aussage Ausnahmen auslösen können - Ihr Code nur kompilieren, wenn es keine gibt geprüfte Ausnahmen, die sein können geworfen.

+0

siehe auch hier https://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html –

+0

Es sollte erwähnt werden, dass "ex" effektiv * sein muss, damit dies funktioniert , dhes darf keine Zuordnung zu "ex" innerhalb des "catch" Blocks geben. – Holger

+0

@Holger: Will, danke. –

1

überprüfen Sie bitte, ob Sie wirklich eine Ausnahme im Code werfen. Andernfalls ist es dem Compiler nicht wichtig, die Ausnahme abzufangen.

public class ExceptionTest { 

    public void test() { 
     try 
     { 
      throw new Exception("Error"); 

     } 
     catch(Exception ex) 
     { 
      // My Compiler says that I don't catch the exception 
      throw ex; 
     } 
    } 

} 

Compiler: Fehler: (14, 13) Java: nicht gemeldete Ausnahme java.lang.Exception; muss erwischt werden oder erklärt werden geworfen

+1

Hallo, danke für deine Eingaben. Das hat mir wirklich geholfen :) – ArunavaS