Jaka jest różnica między rzutem vs. rzuca w Javie
Opublikowany: 2013-07-23Jeden to deklaruje, a drugi to robi
Istnieje pięć słów kluczowych związanych z obsługą wyjątków w Javie, np . try, catch, w końcu, throw i throws . Oprócz różnicy między final, final i finalize , rzut vs rzuty to jedno z najczęściej zadawanych pytań podczas wywiadów w Javie.
- Słowo kluczowe throw służy do zgłaszania wyjątku z dowolnej metody lub bloku statycznego w Javie, natomiast słowo kluczowe throws używane w deklaracji metody oznacza, który wyjątek może zostać zgłoszony przez tę metodę. Nie są wymienne.
- Jeśli jakakolwiek metoda zgłasza zaznaczony wyjątek, jak pokazano w poniższym przykładzie, obiekt wywołujący może obsłużyć ten wyjątek, przechwytując go lub ponownie zgłaszając go, deklarując inną klauzulę throws w deklaracji metody.
- Klauzula Throw może być używana w dowolnej części kodu, w której czujesz, że do metody wywołującej należy zgłosić określony wyjątek.
Omówienie wyjątków Java:
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 |
Jeśli metoda zgłasza wyjątek, powinna być otoczona blokiem try catch, aby go przechwycić, lub ta metoda powinna zawierać klauzulę throws w swoim podpisie. Bez klauzuli throws w sygnaturze kompilator Java JVM nie wie, co zrobić z wyjątkiem. Klauzula throws informuje kompilator, że ten konkretny wyjątek będzie obsługiwany przez metodę wywołującą.
Poniżej znajduje się bardzo prosty przykład, który wyjaśnia zachowanie bloku Throw, Throws, Try, Catch, Last w Javie.
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 ; } } |
Wynik:

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 ) |
Teraz wystarczy zastąpić wiersz 45 i 46 wierszem poniżej, aby zobaczyć poniższy wynik:
1 2 |
//throw new Exception("crunchifyTest2: Oops, FileNotFoundException caught"); System . out . println ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; |
Nowy wynik:
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 |
Lista wszystkich samouczków Java, które mogą Cię zainteresować.
Dodatkowe wskazówki dotyczące wyjątków:
- Normalne wykonanie programu jest natychmiast rozgałęzione, gdy zostanie zgłoszony wyjątek.
- Sprawdzone wyjątki muszą zostać przechwycone lub przekazane. Można to zrobić w instrukcji try… catch lub poprzez zdefiniowanie wyjątku w definicji metody.
- Wyjątek jest przechwytywany przez pierwszy blok catch , którego skojarzona klasa wyjątku jest zgodna z klasą lub nadklasą zgłoszonego wyjątku.
- Jeśli w łańcuchu wyjątków nie zostanie znaleziony pasujący blok catch , wątek zawierający zgłoszony wyjątek zostanie zakończony.
- Blok last po instrukcji try … catch jest wykonywany niezależnie od tego, czy wyjątek został przechwycony, czy nie.
- Zwrócenie w ramach bloku last przerywa łańcuch wyjątków do wywołującego, nawet w przypadku nieprzechwyconych wyjątków.