Wyjątki Java Czy sobie z nimi radzisz, prawda?

  • Joseph Goodman
  • 0
  • 5052
  • 889
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 elementu tablicy Jak korzystać z tablicy Java ArrayList Jak korzystać z tablicy Java ArrayList Tablica 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. poza granicami tablicy oznacza błąd programu. Miłego debugowania!
  • Błąd analizy 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 być może 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łąd, z 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: zaznaczone i niezaznaczone. 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 typu 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 typu 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 ciągu) zgłasza 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 ani 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 () String name = 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 obsługiwać samodzielnie. 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 zawijać 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 … wyrzuca nowy 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

Wyjątkowy ślad stosu 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 prześledzenia sekwencji wywołań, które spowodowały błąd. Wyjątki Javy: Czy dobrze sobie z nimi radzisz? 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. .

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 wydobywania 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ć catch IOException (java.io.IOException ex) // obsłuż tutaj wyjątek. Może być log do pliku dziennika. log.warning (ex.getMessage ());  

Gdy 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 ponownie go zwróć?

spróbuj … ​​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).

spróbuj … ​​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 kilka wyjątków tutaj catch (java.io.IOException ex) // tutaj specyficzna obsługa IOException catch (java.sql.SQLException ex) // SQLException specyficzna obsługa 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 kilka wyjątków catch (java.io.IOException | java.sql.SQLException ex) // Obsługa specyficzna dla IOException i SQLException tutaj catch (SAXException ex) // Obsługa specyficzna dla SAXException tutaj 

Czyszczenie zasobów za pomocą wreszcie

W przypadku kodu, który może zgłaszać wyjątki, konieczne jest właściwe wyczyszczenie wszelkich zasobów, takich jak otwarte pliki Wszystko, co musisz wiedzieć o formatach plików i ich właściwościach Wszystko, co musisz wiedzieć o formatach plików i ich właściwościach Używamy tego słowa plik 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. , połączenia z bazą danych itp. Oczyszczanie zasobów należy wykonać w Wreszcie blok. W ten sposób zarówno normalne wyjście, jak i wyjątkowe wyjście z bloku wywołują kod czyszczenia. 10 najgorszych błędów programistycznych w historii 10 najgorszych błędów programistycznych w historii W jego 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. .

InputStream in = null; spróbuj … in = new FileInputStream (nazwa pliku);… catch (java.io.IOException ex) log.warning (ex.getMessage ());  na koniec // kod tutaj jest wykonywany przy wychodzeniu 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 (…); Connection 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 poprawia jakość kodu Pisanie lub przyspieszanie kodu w edytorze tekstu Linux z niestandardowymi motywami Pisanie lub przyspieszanie kodu w edytorze tekstu Linux z niestandardowymi motywami Twój edytor tekstu w Linuksie nie musi wyglądać ponuro i „funkcjonalnie”. Dlaczego nie zmodyfikować go, aby zwiększyć produktywność, czy to w skryptach i kodowaniach, czy też przy użyciu narzędzia jako edytora znaczników? 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




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.