Obsługa wyjątków w Javie jest jednym ze skutecznych sposobów radzenia sobie z błędami czasu wykonywania, dzięki czemu można zachować regularny przepływ aplikacji. Obsługa wyjątków Java to mechanizm obsługujący błędy czasu wykonywania, takie jak wyjątek ClassNotFoundException, IOException, SQLException, RemoteException itp.
Jakie są wyjątki Java?
W Javie wyjątek to niepożądane lub nieoczekiwane zdarzenie, które ma miejsce podczas wykonywania programu, tj. w czasie wykonywania, i które zakłóca normalny przepływ instrukcji programu. Program może wychwytywać i obsługiwać wyjątki. Gdy w metodzie wystąpi wyjątek, tworzy obiekt. Obiekt ten nazywany jest obiektem wyjątku. Zawiera informacje o wyjątku, takie jak nazwa i opis wyjątku oraz stan programu w momencie wystąpienia wyjątku.
Główne powody wystąpienia wyjątku
- Nieprawidłowe dane wprowadzone przez użytkownika
- Awaria urządzenia
- Utrata połączenia sieciowego
- Ograniczenia fizyczne (pamięć poza dyskiem)
- Błędy kodu
- Otwieranie niedostępnego pliku
Błędy reprezentują nieodwracalne warunki, takie jak brak pamięci wirtualnej maszyny Java (JVM), wycieki pamięci, błędy przepełnienia stosu, niezgodność bibliotek, nieskończona rekurencja itp. Błędy są zwykle poza kontrolą programisty i nie powinniśmy próbować sobie z nimi radzić.
Różnica między błędem a wyjątkiem
Omówmy najważniejszą część, jaką jest różnice między błędem a wyjątkiem to jest następująco:
- Błąd: Błąd wskazuje na poważny problem, którego rozsądna aplikacja nie powinna próbować wyłapać.
- Wyjątek: Wyjątek wskazuje warunki, które rozsądna aplikacja może próbować przechwycić.
Hierarchia wyjątków
Wszystkie typy wyjątków i błędów są podklasami klasy Możliwość rzucania , która jest klasą bazową hierarchii. Kieruje jeden oddział Wyjątek . Ta klasa jest używana w przypadku wyjątkowych warunków, które powinny przechwytywać programy użytkownika. NullPointerException jest przykładem takiego wyjątku. Kolejna gałąź, Błąd jest używany przez system wykonawczy Java ( JVM ), aby wskazać błędy związane z samym środowiskiem wykonawczym (JRE). StackOverflowError jest przykładem takiego błędu.

Hierarchia wyjątków Java
Rodzaje wyjątków
Java definiuje kilka typów wyjątków, które odnoszą się do różnych bibliotek klas. Java umożliwia także użytkownikom definiowanie własnych wyjątków.

Wyjątki można klasyfikować na dwa sposoby:
- Wbudowane wyjątki
- Sprawdzony wyjątek
- Niesprawdzony wyjątek
- Wyjątki zdefiniowane przez użytkownika
Omówmy wyżej zdefiniowany, wymieniony wyjątek, który wygląda następująco:
1. Wbudowane wyjątki
Wbudowane wyjątki to wyjątki dostępne w bibliotekach Java. Te wyjątki nadają się do wyjaśnienia pewnych sytuacji błędów.
- Sprawdzone wyjątki: Sprawdzone wyjątki nazywane są wyjątkami czasu kompilacji, ponieważ te wyjątki są sprawdzane w czasie kompilacji przez kompilator.
- Niesprawdzone wyjątki: Niesprawdzone wyjątki są przeciwieństwem zaznaczonych wyjątków. Kompilator nie będzie sprawdzał tych wyjątków w czasie kompilacji. Krótko mówiąc, jeśli program zgłosi niesprawdzony wyjątek, a nawet jeśli go nie obsłużymy lub nie zadeklarujemy, program nie zwróci błędu kompilacji.
Notatka: Aby zapoznać się z wyjątkami zaznaczonymi i niesprawdzonymi, zobacz Wyjątki zaznaczone i niesprawdzone
2. Wyjątki zdefiniowane przez użytkownika:
Czasami wbudowane wyjątki w Javie nie są w stanie opisać określonej sytuacji. W takich przypadkach użytkownicy mogą również tworzyć wyjątki, zwane „wyjątkami zdefiniowanymi przez użytkownika”.
The zalety obsługi wyjątków w Javie są następujące:
- Zapewnienie pełnej realizacji programu
- Łatwa identyfikacja kodu programu i kodu obsługi błędów
- Propagacja błędów
- Znaczące raportowanie błędów
- Identyfikacja typów błędów
Metody drukowania informacji o wyjątku:
1. printStackTrace()
Metoda ta wypisuje informacje o wyjątku w formacie Nazwa wyjątku: opis wyjątku, ślad stosu.
Przykład:
Jawa
//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > e.printStackTrace();> > }> > }> }> |
>
>
Wyjście
java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>
2. doString()
Metoda toString() wypisuje informacje o wyjątku w formacie Nazwa wyjątku: opis wyjątku.
Przykład:
Jawa
//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > System.out.println(e.toString());> > }> > }> }> |
zestaw maszynopisu
>
>
Wyjście
java.lang.ArithmeticException: / by zero>
3. pobierz wiadomość()
Metoda getMessage() wypisuje jedynie opis wyjątku.
Przykład:
Jawa
//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> > public> static> void> main (String[] args) {> > int> a=> 5> ;> > int> b=> 0> ;> > try> {> > System.out.println(a/b);> > }> > catch> (ArithmeticException e){> > System.out.println(e.getMessage());> > }> > }> }> |
>
>
Wyjście
/ by zero>
Jak JVM obsługuje wyjątek?
Domyślna obsługa wyjątków: Ilekroć wewnątrz metody wystąpił wyjątek, metoda tworzy obiekt znany jako obiekt wyjątku i przekazuje go do systemu wykonawczego (JVM). Obiekt wyjątku zawiera nazwę i opis wyjątku oraz bieżący stan programu, w którym wystąpił wyjątek. Tworzenie obiektu wyjątku i obsługa go w systemie wykonawczym nazywa się zgłaszaniem wyjątku. Może istnieć lista metod, które zostały wywołane w celu dotarcia do metody, w której wystąpił wyjątek. Ta uporządkowana lista metod nazywa się Zadzwoń do stosu . Teraz nastąpi następująca procedura.
- System wykonawczy przeszukuje stos wywołań w celu znalezienia metody zawierającej blok kodu, który może obsłużyć występujący wyjątek. Blok kodu nazywa się Procedura obsługi wyjątków .
- System wykonawczy rozpoczyna wyszukiwanie od metody, w której wystąpił wyjątek, i przechodzi przez stos wywołań w odwrotnej kolejności, w jakiej wywoływano metody.
- Jeśli znajdzie odpowiednią procedurę obsługi, przekazuje do niej zaistniały wyjątek. Odpowiednia procedura obsługi oznacza, że typ zgłoszonego obiektu wyjątku odpowiada typowi obiektu wyjątku, który może obsłużyć.
- Jeśli system wykonawczy przeszukuje wszystkie metody na stosie wywołań i nie może znaleźć odpowiedniej procedury obsługi, wówczas system wykonawczy przekazuje obiekt wyjątku do domyślny moduł obsługi wyjątków , który jest częścią systemu wykonawczego. Ta procedura obsługi drukuje informacje o wyjątku w następującym formacie i kończy działanie programu nieprawidłowo .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>
Spójrz na poniższy diagram, aby zrozumieć przepływ stosu wywołań.

Ilustracja:
Jawa
// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > > // Main driver method> > public> static> void> main(String args[])> > {> > // Taking an empty string> > String str => null> ;> > // Getting length of a string> > System.out.println(str.length());> > }> }> |
>
>
Wyjście

Zobaczmy przykład ilustrujący, jak system wykonawczy wyszukuje odpowiedni kod obsługi wyjątków na stosie wywołań.
Przykład:
Jawa
// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > > // Method 1> > // It throws the Exception(ArithmeticException).> > // Appropriate Exception handler is not found> > // within this method.> > static> int> divideByZero(> int> a,> int> b)> > {> > > // this statement will cause ArithmeticException> > // (/by zero)> > int> i = a / b;> > > return> i;> > }> > > // The runTime System searches the appropriate> > // Exception handler in method also but couldn't have> > // found. So looking forward on the call stack> > static> int> computeDivision(> int> a,> int> b)> > {> > > int> res => 0> ;> > > // Try block to check for exceptions> > try> {> > > res = divideByZero(a, b);> > }> > > // Catch block to handle NumberFormatException> > // exception Doesn't matches with> > // ArithmeticException> > catch> (NumberFormatException ex) {> > // Display message when exception occurs> > System.out.println(> > 'NumberFormatException is occurred'> );> > }> > return> res;> > }> > > // Method 2> > // Found appropriate Exception handler.> > // i.e. matching catch block.> > public> static> void> main(String args[])> > {> > > int> a => 1> ;> > int> b => 0> ;> > > // Try block to check for exceptions> > try> {> > int> i = computeDivision(a, b);> > }> > > // Catch block to handle ArithmeticException> > // exceptions> > catch> (ArithmeticException ex) {> > > // getMessage() will print description> > // of exception(here / by zero)> > System.out.println(ex.getMessage());> > }> > }> }> |
>
>Wyjście
/ by zero>
Jak programista obsługuje wyjątek?
Dostosowana obsługa wyjątków: Obsługa wyjątków Java jest zarządzana za pomocą pięciu słów kluczowych: próbować , złapać , rzucić , rzuca , I Wreszcie . W skrócie, oto jak one działają. Instrukcje programu, które Twoim zdaniem mogą powodować wyjątki, są zawarte w bloku try. Jeśli w bloku try wystąpi wyjątek, zostanie on zgłoszony. Twój kod może przechwycić ten wyjątek (używając bloku catch) i obsłużyć go w jakiś racjonalny sposób. Wyjątki generowane przez system są automatycznie zgłaszane przez system wykonawczy Java. Aby ręcznie zgłosić wyjątek, użyj słowa kluczowego rzut. Każdy wyjątek zgłoszony z metody musi zostać określony jako taki w klauzuli rzutów. Każdy kod, który bezwzględnie musi zostać wykonany po zakończeniu bloku try, jest umieszczany w bloku Final.
Wskazówka: Trzeba przejść kontroluj przepływ w bloku try catch wreszcie dla lepszego zrozumienia.
Potrzeba klauzuli try-catch (niestandardowa obsługa wyjątków)
Rozważ poniższy program, aby lepiej zrozumieć klauzulę try-catch.
Przykład:
10 z 10
Jawa
// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > > // Main driver method> > public> static> void> main(String[] args)> > {> > // Taking an array of size 4> > int> [] arr => new> int> [> 4> ];> > > // Now this statement will cause an exception> > int> i = arr[> 4> ];> > > // This statement will never execute> > // as above we caught with an exception> > System.out.println(> 'Hi, I want to execute'> );> > }> }> |
>
>
Wyjście

Wyjaśnienie wyjścia: W powyższym przykładzie tablica ma zdefiniowany rozmiar, tzn. dostęp do elementów można uzyskać tylko z indeksu 0 do 3. Próba dostępu do elementów o indeksie 4 (przez pomyłkę) powoduje jednak wyjątek. W takim przypadku JVM kończy działanie programu nieprawidłowo . Instrukcja System.out.println(Witam, chcę wykonać); nigdy nie wykona. Aby go wykonać, musimy obsłużyć wyjątek za pomocą try-catch. Dlatego, aby kontynuować normalny przebieg programu, potrzebujemy klauzuli try-catch.
Jak korzystać z klauzuli Try-catch?
try { // block of code to monitor for errors // the code you think can raise an exception } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends }>
Należy pamiętać o kilku kluczowych kwestiach, a mianowicie:
- W metodzie może istnieć więcej niż jedna instrukcja, która może zgłosić wyjątek, dlatego umieść wszystkie te instrukcje w osobnych instrukcjach próbować block i zapewniają oddzielną procedurę obsługi wyjątków w ramach własnej złapać blok dla każdego z nich.
- Jeśli wystąpi wyjątek w obrębie próbować block, wyjątek ten jest obsługiwany przez powiązany z nim moduł obsługi wyjątków. Aby powiązać procedurę obsługi wyjątków, musimy umieścić a złapać blokuj po nim. Może istnieć więcej niż jedna procedura obsługi wyjątków. Każdy złapać block to procedura obsługi wyjątków, która obsługuje wyjątek dla typu wskazanego przez jego argument. Argument „ExceptionType” deklaruje typ wyjątku, który może obsłużyć i musi być nazwą klasy, która dziedziczy po Możliwość rzucania klasa.
- Dla każdego bloku try może być zero lub więcej bloków catch, ale tylko jeden ostatni blok.
- Ostatni blok jest opcjonalny. Zawsze jest wykonywane niezależnie od tego, czy w bloku try wystąpił wyjątek, czy nie. Jeśli wystąpi wyjątek, zostanie on wykonany po spróbuj łapać bloki. A jeśli wyjątek nie wystąpi, zostanie on wykonany po próbować blok. Blok last w Javie służy do umieszczania ważnych kodów, takich jak kod czyszczący, np. zamykający plik lub zamykający połączenie.
- Jeśli w bloku try napiszemy System.exit, to ostatecznie blok nie zostanie wykonany.
Podsumowanie przedstawiono poniżej za pomocą pomocy wizualnej w następujący sposób:

Powiązane artykuły:
- Rodzaje wyjątków w Javie
- Sprawdzone i niesprawdzone wyjątki
- Rzuty-rzuty w Javie
Powiązane kursy
Podstawy programowania w języku Java — kurs samodzielny
Znajdź odpowiedni kurs, aby rozpocząć naukę Java Programming Foundation od ekspertów branżowych z wieloletnim doświadczeniem. Ten Podstawy programowania w języku Java — kurs samodzielny obejmuje podstawy Język programowania Java, typy danych, operatory i sterowanie przepływem, pętle, łańcuchy znaków , i wiele więcej. Nigdy więcej czekania! Zacznij uczyć się JAVA już teraz i zostań kompletnym inżynierem Java!