Was ist ein Unterschied zwischen Wurf vs. wirft in Java
Veröffentlicht: 2013-07-23Der eine erklärt es, der andere tut es
Es gibt fünf Schlüsselwörter im Zusammenhang mit der Ausnahmebehandlung in Java, z. B. try, catch, finally, throw und throws . Neben dem Unterschied zwischen final, final und finalize ist throw vs throws eine der häufig gestellten Java-Interviewfragen.
- throw Schlüsselwort wird verwendet, um eine Ausnahme von jeder Methode oder jedem statischen Block in Java zu werfen, während throws Schlüsselwort , das in der Methodendeklaration verwendet wird, angibt, welche Ausnahme möglicherweise von dieser Methode ausgelöst werden kann. Sie sind nicht austauschbar.
- Wenn eine Methode eine geprüfte Ausnahme auslöst, wie im folgenden Beispiel gezeigt, kann der Aufrufer diese Ausnahme entweder behandeln, indem er sie abfängt, oder sie erneut auslösen, indem er eine andere throws-Klausel in der Methodendeklaration deklariert.
- Die Throw-Klausel kann in jedem Teil des Codes verwendet werden, in dem Sie der Meinung sind, dass eine bestimmte Ausnahme an die aufrufende Methode geworfen werden muss.
Untertreibung von Java-Ausnahmen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
java . lang . Object | +-- java . lang . Throwable | +-- java . lang . Exception | | | +-- java . lang . ClassNotFoundException | | | +-- java . io . IOException | | | | | +-- java . io . FileNotFoundException | | | +-- java . lang . RuntimeException | | | +-- java . lang . NullPointerException | | | +-- java . lang . IndexOutOfBoundsException | | | +-- java . lang . ArrayIndexOutOfBoundsException | +-- java . lang . Error | +-- java . lang . VirtualMachineError | +-- java . lang . OutOfMemoryError |
Wenn eine Methode eine Ausnahme auslöst, sollte sie entweder von einem try-catch-Block umgeben sein, um sie abzufangen, oder diese Methode sollte die throws-Klausel in ihrer Signatur haben. Ohne die throws-Klausel in der Signatur weiß der Java-JVM-Compiler nicht, was er mit der Ausnahme machen soll. Die throws-Klausel teilt dem Compiler mit, dass diese bestimmte Ausnahme von der aufrufenden Methode behandelt wird.
Unten ist ein sehr einfaches Beispiel, das das Verhalten von Throw, Throws, Try, Catch, finally block in Java erklärt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com . crunchify . tutorials ; import java . io . FileInputStream ; import java . io . FileNotFoundException ; /** * @author Crunchify.com */ public class CrunchifyThrowThrows { @SuppressWarnings ( "unused" ) public static void main ( String args [ ] ) throws Exception { FileInputStream crunchifyStream1 = null ; FileInputStream crunchifyStream2 = null ; String fileName = "Crunchify.txt" ; System . out . println ( "main: Starting " + CrunchifyThrowThrows . class . getName ( ) + " with file name = " + fileName ) ; // get file input stream 1 try { crunchifyStream1 = crunchifyTest1 ( fileName ) ; } catch ( FileNotFoundException ex ) { System . out . println ( "main: Oops, FileNotFoundException caught" ) ; } catch ( Exception ex ) { System . out . println ( "main: Oops, genreal exception caught" ) ; } // get file input stream 2 crunchifyStream2 = crunchifyTest2 ( fileName ) ; System . out . println ( "main: " + CrunchifyThrowThrows . class . getName ( ) + " ended" ) ; } public static FileInputStream crunchifyTest1 ( String fileName ) throws FileNotFoundException { FileInputStream crunchifyStream = new FileInputStream ( fileName ) ; System . out . println ( "crunchifyTest1: File input stream created" ) ; return crunchifyStream ; } public static FileInputStream crunchifyTest2 ( String fileName ) throws Exception { FileInputStream crunchifyStream = null ; try { crunchifyStream = new FileInputStream ( fileName ) ; } catch ( FileNotFoundException ex ) { throw new Exception ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; //System.out.println("crunchifyTest2: Oops, FileNotFoundException caught"); } finally { System . out . println ( "crunchifyTest2: finally block" ) ; } System . out . println ( "crunchifyTest2: Returning from crunchifyTest2" ) ; return crunchifyStream ; } } |
Ergebnis:

1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : finally block Exception in thread "main" java . lang . Exception : crunchifyTest2 : Oops , FileNotFoundException caught at com . crunchify . tutorials . CrunchifyThrowThrows . crunchifyTest2 ( CrunchifyThrowThrows . java : 45 ) at com . crunchify . tutorials . CrunchifyThrowThrows . main ( CrunchifyThrowThrows . java : 30 ) |
Ersetzen Sie jetzt einfach die Zeilen 45 und 46 durch die folgende Zeile, um das folgende Ergebnis zu sehen:
1 2 |
//throw new Exception("crunchifyTest2: Oops, FileNotFoundException caught"); System . out . println ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; |
Neues Ergebnis:
1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : Oops , FileNotFoundException caught crunchifyTest2 : finally block crunchifyTest2 : Returning from crunchifyTest2 main : com . crunchify . tutorials . CrunchifyThrowThrows ended |
Liste aller Java-Tutorials, die Sie interessieren könnten.
Bonus-Tipps zu Ausnahmen:
- Die normale Programmausführung wird sofort verzweigt, wenn eine Ausnahme ausgelöst wird.
- Geprüfte Ausnahmen müssen abgefangen oder weitergeleitet werden. Dies kann in einer try … catch- Anweisung oder durch Definition der Ausnahme in der Methodendefinition erfolgen.
- Die Ausnahme wird vom ersten Catch -Block abgefangen, dessen zugeordnete Ausnahmeklasse mit der Klasse oder einer Oberklasse der ausgelösten Ausnahme übereinstimmt.
- Wenn in der Ausnahmekette kein passender Catch -Block gefunden wird, wird der Thread, der die ausgelöste Ausnahme enthält, beendet.
- Der finally -Block nach einer try … catch -Anweisung wird unabhängig davon ausgeführt, ob eine Ausnahme abgefangen wird oder nicht.
- Die Rückkehr innerhalb eines finally -Blocks unterbricht die Ausnahmekette zum Aufrufer, sogar für nicht abgefangene Ausnahmen.