Lepsze zrozumienie w sprawdzonych vs. Niesprawdzone wyjątki – jak lepiej radzić sobie z wyjątkami w Javie?
Opublikowany: 2014-09-15Sprawdzony wyjątek
Co to jest zaznaczony wyjątek w języku programowania Java. W prostym języku: Wyjątek, który jest sprawdzany w czasie kompilacji o nazwie Sprawdzony wyjątek. Niektóre z nich są wymienione poniżej. Jeśli w twoim kodzie, jeśli jakaś metoda zgłasza checked exception
, wtedy metoda musi albo handle the exception
, albo musi określić wyjątek za pomocą słowa kluczowego throws
.
- IOException
- SQLException
- DataAccessException
- Klasa nie znaleziono wyjątku
- WywołanieTargetException
- Wyjątek nieprawidłowego adresu URL
Spójrzmy na przykład:
W poniższym przykładzie zamierzamy pobrać zawartość strony „Crunchify.com” i wydrukować ją w konsoli. Podczas tej operacji program Java zgłosi MalformedURLException
lub IOException
w poniżej podświetlonych wierszach.
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 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } in . close ( ) ; return sb . toString ( ) ; } } |
Można to rozwiązać na dwa sposoby. Add throws clause
LUB Add Try, Catch block
do kodu, aby go rozwiązać. Oto zaktualizowany kod.
- Zmodyfikuj linie 16 i 20 i dodaj
throws IOException
- Dodaj try catch block na 26,42,43
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 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) throws IOException { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) throws IOException { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; try { URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } } catch ( IOException e ) { // TODO: Consume and Throw an error with detailed message. } in . close ( ) ; return sb . toString ( ) ; } } |

Niesprawdzony wyjątek
Niezaznaczony wyjątek w Javie to te wyjątki, których obsługa NOT verified during Compile time
. Te wyjątki występują z powodu złego programowania.
Program nie wyświetli błędu kompilacji.
Wszystkie niesprawdzone wyjątki są bezpośrednimi podklasami klasy RuntimeException
.
Simple Example
: Utworzyłeś formularz online, który akceptuje dane wprowadzane przez użytkownika. To darmowa forma tekstowa. Użycie może wpisać błędną wartość w przypadku pola e-mail, pola nazwy użytkownika LUB pola numeru telefonu.
Jeśli nie masz walidacji po stronie klienta, istnieje więcej możliwości uzyskania wyjątku walidacji środowiska uruchomieniowego podczas uruchamiania aplikacji w środowisku produkcyjnym. Błąd może zostać wygenerowany przez operację DB lub konwersję pola z jednego formatu na inny.
Poniżej znajdują się typy niesprawdzonych wyjątków:
- NullPointerException
- ArrayIndexOutOfBound
- Niedozwolony argumentWyjątek
- Nielegalny wyjątek stanu
Najbardziej denerwuje mnie wyjątek NullPointer. W zeszłym tygodniu napisałem szczegółowy artykuł na temat NPE.
Dostępnych jest łącznie 8 różnych wskazówek, aby uniknąć NPE.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; try { String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } catch ( ArrayIndexOutOfBoundsException e ) { System . out . println ( "ArrayIndexOutOfBoundException appears here. Better handle it in code above :)" + e ) ; } } } |
W Javie 7 można obsłużyć wiele wyjątków w jednym Catch block
. Możesz zmienić linię 13 z górnej linii na dolną.
1 |
} catch ( ArrayIndexOutOfBoundsException | NumberFormatException e ) { |
Podsumowując, zarówno zaznaczony, jak i niesprawdzony wyjątek są obsługiwane za pomocą słowa kluczowego try, catch
i w finally
.
Pod względem funkcjonalności Sprawdzone i Niesprawdzone Wyjątki są takie same.