CodeGym /Blog Java /Random-PL /Wypróbuj Java - złap
John Squirrels
Poziom 41
San Francisco

Wypróbuj Java - złap

Opublikowano w grupie Random-PL
Podczas wykonywania programu mogą wystąpić błędy. To częsty problem każdego programisty, od początkującego po prawdziwego profesjonalistę. Nie wszystkie błędy powstają z winy programisty. Niektóre z nich są trudne do przewidzenia, a czasami nie jest to możliwe. Na przykład podczas pobierania programu połączenie sieciowe może nagle zostać zerwane lub może nastąpić przerwa w dostawie prądu. Takie sytuacje nazywane są wyjątkami. Try i catch to części konstrukcji używane do obsługi wyjątków.

Java spróbuj złapać blok

Gdy wystąpi błąd, Java zwykle zatrzymuje się i generuje komunikat o błędzie. Ten proces nazywa się „Java zgłasza wyjątek”. Java zapewnia specjalne możliwości obsługi wyjątków. Jednym z nich jest próba… złapanie… wreszcie konstrukcja. Oto składnia bloku try, bloku catch i bloku wreszcie.
//try block
try {
  // Block of code to try
}
//try catch
catch(Exception e) {
  // Block of code to handle errors
}
finally {
 // Optional block of code
          }
Kiedy w bloku try wystąpi wyjątek, kontrola przechodzi do bloku catch, który może obsłużyć wyjątek. Jeżeli taki blok nie zostanie znaleziony, użytkownikowi zostanie wyświetlony komunikat o nieobsługiwanym wyjątku i dalsze wykonywanie programu zostanie zatrzymane. Aby zapobiec takiemu zatrzymaniu awaryjnemu należy zastosować blok try..catch. Próba Java — złap — 1

Krótko o try, catch, na koniec rzuca słowa kluczowe

Obsługa wyjątków w Javie opiera się na użyciu w programie następujących słów kluczowych:
  • try — definiuje blok kodu, w którym może wystąpić wyjątek;
  • catch — definiuje blok kodu, w którym obsługiwany jest wyjątek;
  • wreszcie — definiuje blok kodu, który jest opcjonalny, ale jeśli jest obecny, i tak jest wykonywany, niezależnie od wyników bloku try.
Te słowa kluczowe służą do tworzenia specjalnych konstrukcji przetwarzających w kodzie programu: spróbuj catch i spróbuj catch wreszcie}.
  • rzut — używany do zgłoszenia wyjątku;
  • rzuty — używane w sygnaturach metod, aby ostrzec, że metoda może zgłosić wyjątek.

Łatwy przykład konstrukcji typu try-catch

Załóżmy, że mamy program z jakąś tablicą.
public class TryTest {
   public static void main(String[] args) {
       int[] myArray = new int[5];
       myArray[7] = 8;
       System.out.println(myArray[7]);
   }
}
Ponieważ próbujemy uzyskać dostęp do elementu tablicy z nieistniejącym indeksem, program zakończy się z błędem:
Wyjątek w wątku „main” java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:6) Proces zakończony kodem zakończenia 1
Zmodyfikujmy ten program i obsłużmy ten wyjątek za pomocą try-catch. Najpierw spróbuj blokować, później złap blok.
//try catch example
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {
           System.out.println("The exception was handled...");
       }

       System.out.println("This is the end of the program...");
   }
}
Teraz dane wyjściowe uległy zmianie:
Wyjątek został obsłużony... To koniec programu... Proces zakończony kodem zakończenia 0 Proces zakończony kodem zakończenia 0
W tym wypadku program zakończył się poprawnie, na ekranie wyświetli się nasz komunikat. Prawidłowe zakończenie programu sygnalizowane jest kodem 0 na koniec procesu, natomiast niepoprawne — 1. W przypadku użycia bloku try...catch w pierwszej kolejności wykonywane są wszystkie instrukcje znajdujące się pomiędzy instrukcjami try i catch. Jeśli w bloku try wystąpi wyjątek, normalna kolejność wykonywania zostanie zatrzymana i przejdzie do instrukcji catch. Dlatego też, gdy wykonanie programu osiągnie liczby[7]=8; linii program zatrzyma się i przejdzie do bloku catch. W naszym przypadku zadeklarowaliśmy zmienną myEx o typie Wyjątek. Jest to klasa bazowa dla wszystkich wyjątków, więc mogą się one różnić. Istnieją na przykład wyjątki odpowiedzialne za przepełnienie stosu, wykraczające poza indeksowanie tablicy, jak w naszym przypadku wskazujące na Null i tak dalej. Gdybyśmy nie odgadli rodzaju wyjątku, program również zakończyłby się niepoprawnie. Jednak dla uproszczenia przykładu wybraliśmy typ wyjątku i jest to klasa bazowa dla wszystkich wyjątków. Zatem instrukcja catch (Exception myEx) obsłuży prawie wszystkie wyjątki. Obsługa wyjątku w tym przypadku. Po zakończeniu bloku catch program kontynuuje swoją pracę, wykonując wszystkie pozostałe instrukcje po bloku catch. Jeśli chcesz zobaczyć, jakie wystąpiły wyjątki, możesz poprosić program o wydrukowanie śladu stosu wywołań metod. Oto, co robi JVM, gdy wystąpi nieprzechwycony wyjątek: zatrzymuje wykonywanie programu i drukuje ślad stosu po wykonaniu kodu bloku last, jeśli istnieje.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {

         myEx.printStackTrace();
       }

       System.out.println("This is the end of the program...");
   }
}
Obsługa wyjątku w tym przypadku sprowadza się do wydrukowania stosu śledzenia błędów na konsolę za pomocą metody printStackTrace() zdefiniowanej w klasie Wyjątek .
java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:7) To jest koniec programu... Proces zakończony kodem zakończenia 0
Jednak program zakończył działanie poprawnie.

Wreszcie! Po złapaniu

W przykładzie oraz w definicjach słów kluczowych dotyczących obsługi wyjątków wspomnieliśmy o bloku final. Jest to opcjonalne, ale jeśli jest obecne, zostanie wykonane niezależnie od wyników bloku try. Zmieńmy typ wyjątku na NullPointerException.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (NullPointerException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
Oto dane wyjściowe:
Wyjątek w wątku „main” java.lang.ArrayIndexOutOfBoundsException: Indeks 7 poza zakresem dla długości 5 w dniach.TryTest.main(TryTest.java:7) w końcu Proces zakończony z kodem zakończenia 1
Przy okazji możemy określić, jaki typ wyjątku będzie poprawny. Tutaj jest to wyjątek IndexOutOfBoundsException.
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (IndexOutOfBoundsException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
W tym przypadku wynik będzie następujący:
Wyjątek został obsłużony... w końcu To koniec programu... Proces zakończył się kodem zakończenia 0

Jak działają wyjątki?

Rzecz w tym, że wszystkich tych słów —catch, Throw, Throwable można używać tylko z językiem java.lang.Throwable lub jego potomkami. Możesz na przykład to zrobić:
public class MyClass {
    public static void main(String[] args) {
        try {
        } catch (Throwable thr) {
}
    }
}
Nie można jednak tego zrobić w ten sposób:
public class MyClass {
public static void main(String[] args) {
        try {
        } catch (String thr) {
}
    }
}
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION