Reklama
Wyjątek w programowaniu oznacza wyjątkowy warunek w pewnym momencie wykonywania programu. Jest stosowany, gdy wyjątkowy warunek można lepiej rozwiązać w innym miejscu niż w miejscu, w którym się on pojawia. Rozważ następujące przykłady:
- Niepowodzenie otwarcia pliku konfiguracyjnego można lepiej rozwiązać wyżej w kodzie, być może poprzez zastosowanie alternatywnej lokalizacji pliku konfiguracyjnego.
- Dostęp do element tablicy Jak korzystać z Java ArrayListTablica Java jest uniwersalną tablicą o zmiennym rozmiarze. Zapewnia większość udogodnień ogólnie oczekiwanych od tablic w innych językach. W tym artykule nauczysz się konfigurować i korzystać z tablicy arraylist. Czytaj więcej poza granicami tablicy oznacza błąd programu. Miłego debugowania!
- Błąd analizowania XML powinien zostać zgłoszony użytkownikowi, aby plik XML mógł zostać poprawiony.
- Programowi brakuje pamięci (być może podczas przetwarzania dużego pliku) może zostać naprawiony przez zwiększenie ilości pamięci dostępnej dla procesu Java.
We wszystkich tych przypadkach (i nie tylko) wyjątek powinien być obsługiwany poza miejscem, w którym został wygenerowany, aby można było rozwiązać przyczynę problemu.
Rodzaje wyjątków
Poniższy obraz przedstawia główne części Hierarchii wyjątków Java. Klasa podstawowa to Ogrzać który jest podklasowany w Wyjątek i Błąd. Klasa Wyjątek dotyczy warunków związanych z programem, które aplikacje mogą złapać, próbując ratować sytuację. Klasa Błądz drugiej strony służy do wskazywania poważnych błędów w środowisku wykonawczym Java, których aplikacje nie powinny wychwytywać. Oto niektóre przykłady: Błąd brak pamięci i StackOverflowError.
Na Wyjątek znowu jest dwojakiego rodzaju: zaznaczony i niezaznaczony. Sprawdzony wyjątek musi być obsłużony przez kod wywołujący. Ta reguła jest egzekwowana przez kompilator Java. Z drugiej strony niesprawdzony wyjątek można propagować w górę łańcucha połączeń bez konieczności jawnego deklarowania go. Poniższe przykłady wyjaśnią.
Sprawdzone wyjątki
Następująca metoda próbuje utworzyć FileReader z pliku. Konstruktor zgłasza sprawdzony wyjątek FileNotFoundException które muszą być obsługiwane przez kod wywołujący lub zadeklarowane jako wyrzucenie.
Będzie następujący kod nie kompiluje, ponieważ nie robi tego.
private void loadFile (nazwa pliku string) {FileReader in = new FileReader (nazwa pliku); }
Jednym ze sposobów na skompilowanie kodu jest obsłużenie wyjątku (patrz poniżej).
private void loadFile (nazwa pliku string) {try {FileReader in = new FileReader (nazwa pliku)); {} catch (FileNotFoundException ex) {// obsłuż wyjątek tutaj} }
Jeśli wyjątek nie może zostać obsłużony bezpośrednio przez program wywołujący, musi zostać zadeklarowany w podpisie metody.
private void loadFile (nazwa pliku string) wyrzuca java.io. FileNotFoundException. {FileReader in = new FileReader (nazwa pliku)); { }
Niezaznaczone wyjątki
Niezaznaczonym wyjątkiem jest ten, który jest podklasą RuntimeException i nie muszą być traktowane bezpośrednio lub zadeklarowane jak powyżej. Na przykład następujący kod daje w wyniku NullPointerException, który jest rodzajem RuntimeException. Od tego czasu kod kompiluje się jednak bezbłędnie NullPointerException jest niesprawdzonym wyjątkiem.
private void handleEvent () {Nazwa ciągu = null; if (name.length ()> 0) {} }
Zawijanie wyjątków
Biorąc pod uwagę powyższą dyskusję na temat sprawdzonych i niezaznaczonych wyjątków, wydaje się, że łatwiej jest poradzić sobie z niesprawdzonymi wyjątkami, ponieważ nie musisz ich deklarować ani sam się nimi zajmować. Mając to na uwadze, czasami przydatne może być zawinięcie zaznaczonego wyjątku w niesprawdzony wyjątek.
Poniższy przykład kodu pokazał, jak owinąć wyjątek. Metoda method_1 () rzuca SQLException w jego ciele. Aby kod mógł się poprawnie skompilować, należy zgłosić wyjątek.
private void method_1 () zgłasza SQLException {... wrzuć nowy wyjątek SQLException; }
Gdy ta metoda zostanie wywołana z innej metody (method_2 ()), ta metoda może złapać SQLException i zawiń go w niesprawdzonym wyjątku, aby nie musiał deklarować wyjątku w podpisie metody.
private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {wyrzuć nowy RuntimeException (ex); } }
Wyjątek Śledzenie stosu
Śledzenie stosu wyjątków odnosi się do tablicy aktywnych ramek stosu, z których każda reprezentuje wywołanie metody, przechwycone przez JVM w momencie zgłoszenia wyjątku. Każda ramka stosu zawiera lokalizację wywołania metody, w tym nazwę klasy, nazwę metody i ewentualnie nazwę pliku źródłowego Java i numer wiersza w pliku. Jest to przydatne do śledzenia sekwencji połączeń które spowodowało błąd Wyjątki Java: czy sobie z nimi radzisz?Wyjątek w programowaniu oznacza wyjątkowy warunek w wykonywaniu programu. Jest używany, gdy warunek można lepiej rozwiązać w innym miejscu. Rozważ następujące przykłady obsługi wyjątków Java. Czytaj więcej .
Oto typowy ślad stosu, uzyskany z obiektu wyjątku, gdy został on złapany.
Wyjątek w wątku „main” java.lang. IndexOutOfBoundsException: Indeks: 8, Rozmiar: 5 w java.util. ArrayList.rangeCheck (ArrayList.java: 653) w java.util. ArrayList.get (ArrayList.java: 429) w sample.sample1.main (sample1.java: 24)
Złapany jest tutaj wyjątek IndexOutOfBoundsException. Zawiera dodatkowe informacje o błędzie. Ślad stosu zawiera 3 ramki stosu, z których każda zawiera informacje o lokalizacji, jak pokazano.
Obsługa wyjątków
Można obsłużyć wyjątek, łapiąc go w pliku próbuj złapać blokować i podejmować wszelkie wymagane działania naprawcze. The Wyjątek Obiekt udostępnia kilka metod wyodrębniania informacji o stanie, który je spowodował.
Poniższy kod rejestruje komunikat o błędzie w pliku dziennika.
private void loadConfig () {try {// wywołaj kod, który może wygenerować wyjątek IOException} (java.io. IOException ex) {// obsłuż tutaj wyjątek. Może być log do pliku dziennika. log.warning (ex.getMessage ()); } }
Kiedy wyjątek jest zawinięty w inny, możesz pobrać zawinięty wyjątek:
Throwable cause = ex.getCause (); log.warning („Przyczyna leżąca u podstaw”: + cause.getMessage ());
Czy potrzebujesz dostępu do śladu stosu i może wyodrębnić nazwę metody, która go spowodowała?
StringBuilder sbuf = new StringBuilder („Stack Trace:”); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
A może zaloguj wyjątek i wrzuć go ponownie?
próbować {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); rzuć ex; }
The Wyjątek klasa zapewnia printStackTrace () metoda, która może wydrukować ślad stosu do własnego PrintStream (lub PrintWriter).
próbować {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Możesz złapać wiele rodzajów wyjątków w jednym próbować zablokuj i wykonaj określoną obsługę dla każdego typu wyjątku.
spróbuj {// zgłasza tutaj wyjątki. } catch (java.io. IOException ex) {// Obsługa specyficzna dla IOException tutaj. } catch (java.sql. SQLException ex) {// Obsługa specyficzna dla SQLException tutaj. }
Aby złapać wiele typów wyjątków, ale użyć tego samego kodu obsługi, możesz zadeklarować a złapać blokuj z wieloma typami w następujący sposób:
spróbuj {// zgłasza tutaj wyjątki. } catch (java.io. IOException | java.sql. SQLException ex) {// IOException i SQLException specyficzna obsługa tutaj. } catch (SAXException ex) {// Obsługa specyficzna dla SAXException tutaj. }
Ostateczne czyszczenie zasobów
W przypadku kodu, który może zgłaszać wyjątki, niezbędne jest prawidłowe wyczyszczenie wszelkich zasobów, takie jak otwarte pliki Wszystko, co musisz wiedzieć o formatach plików i ich właściwościachPliku słów używamy zamiennie: muzyka, obraz, arkusz kalkulacyjny, pokaz slajdów i tak dalej. Ale co w ogóle czyni plik „plikiem”? Spróbujmy zrozumieć tę podstawową część informatyki. Czytaj więcej , połączenia z bazą danych itp. Oczyszczanie zasobów należy wykonać w Wreszcie blok. W ten sposób wywoływane jest zarówno normalne wyjście, jak i wyjątkowe wyjście z bloku kod czyszczenia 10 najgorszych błędów programistycznych w historiiW swojej historycznej przeszłości kodowanie spowodowało również zniszczenie. Wystąpienie odrobiny złego kodu spowodowało katastrofę na dużym poziomie. Oto 10 najgorszych błędów programistycznych w historii. Czytaj więcej .
InputStream in = null; próbować {... in = nowy FileInputStream (nazwa pliku);... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } na koniec {// kod tutaj jest wykonywany po wyjściu z bloku try, // normalnie lub z powodu wyjątku if (in! = null) in.close (); }
Blok Try-With-Resources
Java 1.7 wprowadziła try-with-resources konstrukcja, która ułatwia czyszczenie zasobów. To wygląda tak:
try (InputStream in = new FileInputStream (..)) {// kod, który używa InputStream. }
Kiedy kod wychodzi z bloku (czy to czysto, czy z powodu wyjątku), Strumień wejściowy zmienna jest automatycznie czyszczona.
Oczyść wiele zasobów, deklarując je wszystkie w głowie bloku.
try (InputStream in = new FileInputStream (..); Połączenie con =...; ) {// kod, który używa InputStream i połączenia. }
Dowolny obiekt, którego klasa implementuje AutoCloseable interfejs można wyczyścić w ten sposób. Następująca klasa wykonuje określone czyszczenie w blisko() metoda.
klasa publiczna MyClass implementuje AutoCloseable {public void close () {// kod czyszczenia tutaj} }
Użyj wystąpienia tej klasy w try-with-resources blok.
try (MyClass obj = new MyClass (..)) {// kod, który używa obiektu MyClass. }
Niektóre często spotykane wyjątki
Rzućmy teraz okiem na niektóre często spotykane wyjątki.
- IndexOutOfBoundsException (niezaznaczone): wskazuje, że indeks elementu, do którego uzyskiwany jest dostęp, jest poza granicami tablicy, łańcucha itp.
- SQLException (zaznaczone): wyrzucony z powodu błędu bazy danych.
- IOException (zaznaczone): błąd dostępu do pliku lub błędy związane z wejściem i wyjściem.
- InterruptedException (zaznaczone): generowane, gdy wykonywanie wątku zostanie przerwane.
- SAXException (zaznaczone): zgłaszane z powodu błędów analizy XML.
- NullPointerException (niezaznaczone): użycie null, gdy wymagany jest obiekt.
Podsumowanie
Wyjątki są podstawową metodą raportowania błędów i zarządzania w Javie. Właściwe stosowanie wyjątków poprawić jakość kodu Szybsze pisanie lub pisanie kodu w edytorze tekstowym Linux dzięki niestandardowym motywomTwój edytor tekstu w Linuksie nie musi wyglądać ponuro i „funkcjonalnie”. Dlaczego nie zmodyfikować go, aby zwiększyć produktywność, czy to w skryptowaniu i kodowaniu, czy też w użyciu narzędzia jako edytora znaczników? Czytaj więcej i pomoc w rozwiązywaniu problemów związanych z produkcją.
Czy masz jakieś historie wojenne związane z wyjątkami? Jeśli tak, powiedz nam o tym w sekcji komentarzy poniżej.
Zdjęcie: Dmitrij Nikołajew za pośrednictwem Shutterstock.com