Jak prawidłowo obsługiwać wyjątki Java

  • William Charles
  • 0
  • 4237
  • 509
Reklama

Jako początkujący programista Jak nauczyć się programować bez stresu Jak nauczyć się programować bez stresu Być może zdecydowałeś się kontynuować programowanie, czy to dla kariery, czy dla hobby. Świetny! Ale może zaczynasz czuć się przytłoczony. Nie za dobrze. Oto pomoc w ułatwieniu podróży. , koncepcja Obsługa wyjątków może być trudno owinąć głowę. Nie chodzi o to, że sama koncepcja jest trudna, ale terminologia może sprawiać, że wydaje się bardziej zaawansowana niż jest. Jest to tak potężna funkcja, że ​​jest podatna na niewłaściwe użycie i nadużycie.

W tym artykule dowiesz się, jakie są wyjątki, dlaczego są ważne, jak z nich korzystać oraz jakie typowe błędy należy unikać. Większość współczesnych języków 6 najłatwiejszych języków programowania dla początkujących 6 najłatwiejszych języków programowania dla początkujących Nauka programowania polega na znalezieniu odpowiedniego języka, tak samo jak na procesie edycji. Oto sześć najpopularniejszych języków programowania dla początkujących. masz jakąś obsługę wyjątków, więc jeśli kiedykolwiek przejdziesz z Javy 7 Przydatne sztuczki do opanowania nowego języka programowania 7 Przydatne sztuczki do opanowania nowego języka programowania Możesz być przytłoczony, kiedy uczysz się kodować. Prawdopodobnie zapomnisz o rzeczach tak szybko, jak się ich nauczysz. Te wskazówki pomogą ci lepiej zachować wszystkie nowe informacje. , możesz zabrać ze sobą większość tych wskazówek.

Zrozumienie wyjątków Java

W Javie an wyjątek to obiekt, który wskazuje na coś nienormalnego (lub “wyjątkowy”) wystąpiło podczas uruchamiania aplikacji. Takie są wyjątki rzucony, co w zasadzie oznacza, że ​​tworzony jest obiekt wyjątku (podobnie jak błędy “podniesiony”).

Piękno polega na tym, że możesz złapać zgłoszone wyjątki, które pozwalają uporać się z nienormalnym stanem i umożliwić kontynuowanie działania aplikacji, tak jakby nic nie poszło nie tak. Na przykład, podczas gdy wskaźnik zerowy w C może spowodować awarię aplikacji, Java pozwala rzucać i łapać NullPointerExceptions zanim zmienna zerowa ma szansę spowodować awarię.

Pamiętaj, że wyjątek jest tylko przedmiotem, ale ma jedną ważną cechę: należy go rozszerzyć z Wyjątek klasa lub dowolna podklasa Wyjątek. Chociaż Java ma wiele wbudowanych wyjątków, możesz także utworzyć własne, jeśli chcesz. Niektóre z najczęstszych wyjątków Java to:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Co się stanie, gdy rzucisz wyjątek?

Po pierwsze, Java sprawdza w bezpośredniej metodzie, czy jest kod obsługujący zgłoszony wyjątek. Jeśli moduł obsługi nie istnieje, sprawdza metodę, która wywołała bieżącą metodę, aby sprawdzić, czy istnieje uchwyt. Jeśli nie, to sprawdza wywołaną metodę że metoda, a następnie następna metoda itp. Jeśli wyjątek nie zostanie wykryty, aplikacja drukuje ślad stosu, a następnie ulega awarii. (W rzeczywistości jest bardziej szczegółowy niż zwykłe zawieszanie się, ale jest to zaawansowany temat wykraczający poza zakres tego artykułu).

ZA Ślad stosu jest listą wszystkich metod, które przemierzał Java, szukając procedury obsługi wyjątków. Oto jak wygląda ślad stosu:

Wyjątek w wątku „main” java.lang.NullPointerException w com.example.myproject.Book.getTitle (Book.java:16) w com.example.myproject.Author.getBookTitles (Autor.java:25) w com.example. myproject.Bootstrap.main (Bootstrap.java:14)

Możemy z tego wiele czerpać. Po pierwsze, zgłoszony wyjątek to NullPointerException. Wystąpiło w getTitle () metoda w wierszu 16 Book.java. Ta metoda została wywołana z getBookTitles () na linii 25 Autor.java. Że metoda została wywołana z Główny() w linii 14 Bootstrap.java. Jak widać, znajomość tego wszystkiego ułatwia debugowanie.

Ale znowu, prawdziwą zaletą wyjątków jest to, że możesz “uchwyt” nienormalny warunek, wychwytując wyjątek, ustawiając wszystko poprawnie i wznawiając aplikację bez awarii.

Używanie wyjątków Java w kodzie

Powiedzmy, że masz someMethod () , który przyjmuje liczbę całkowitą i wykonuje logikę, która może się zepsuć, jeśli liczba całkowita jest mniejsza niż 0 lub większa niż 100. To może być dobre miejsce na zgłoszenie wyjątku:

public void someMethod (int value) if (value 100) throw new IllegalArgumentException();  //…

Aby złapać ten wyjątek, musisz iść do miejsca someMethod () jest wywoływany i użyj blok try-catch:

public void callMethod () try someMethod (200); someOtherMethod ();  catch (IllegalArgumentException e) // obsłuż wyjątek tutaj //……

Wszystko w obrębie próbować blok będzie wykonywany w kolejności do momentu zgłoszenia wyjątku. Natychmiast po zgłoszeniu wyjątku wszystkie kolejne instrukcje są pomijane, a logika aplikacji natychmiast przeskakuje do złapać blok.

W naszym przykładzie wchodzimy do bloku try i natychmiast wywołujemy someMethod (). Ponieważ 200 nie mieści się w przedziale od 0 do 100, an IllegalArgumentException Jest rzucony. To natychmiast kończy wykonywanie someMethod (), pomija resztę logiki w bloku try (someOtherMethod () nigdy nie jest wywoływany) i wznawia wykonywanie w bloku catch.

Co by się stało, gdybyśmy zadzwonili someMethod (50) zamiast? The IllegalArgumentException nigdy nie zostanie wyrzucony. someMethod () wykonałby się normalnie. Blok try wykonałby się normalnie, wywołując someOtherMethod () po zakończeniu someMethod (). Gdy someOtherMethod () kończy się blok blokowania zostanie pominięty i callMethod () kontynuowałby.

Pamiętaj, że możesz mieć wiele bloków catch na blok try:

public void callMethod () try someMethod (200); someOtherMethod ();  catch (IllegalArgumentException e) // obsłuż wyjątek tutaj catch (NullPointerException e) // obsłuż wyjątek tutaj //…

Należy również pamiętać, że opcjonalne Wreszcie blok istnieje również:

public void method () try //… catch (Exception e) //… wreszcie //…

Kod w bloku wreszcie to zawsze wykonane bez względu na wszystko. Jeśli w bloku try znajduje się instrukcja return, blok w końcu jest wykonywany przed powrotem z metody. Jeśli rzucisz inny wyjątek w bloku catch, blok w końcu zostanie wykonany przed zgłoszeniem wyjątku.

Powinieneś użyć bloku ostatecznie, gdy masz obiekty, które muszą zostać wyczyszczone przed zakończeniem metody. Na przykład, jeśli otworzyłeś plik w bloku try, a później zgłosiłeś wyjątek, blok w końcu pozwala zamknąć plik przed opuszczeniem metody.

Zauważ, że możesz mieć wreszcie blok bez bloku catch:

public void method () try //… wreszcie //…

Pozwala to na wykonanie koniecznego czyszczenia, jednocześnie pozwalając zgłoszonym wyjątkom propagować stos wywołań metod (tj. Nie chcesz obsługiwać wyjątku tutaj, ale nadal musisz najpierw wyczyścić).

Sprawdzone vs. Niesprawdzone wyjątki w Javie

W przeciwieństwie do większości języków Java rozróżnia sprawdzone wyjątki i niezaznaczone wyjątki (np. C # ma tylko niezaznaczone wyjątki). Sprawdzony wyjątek musi zostać złapanym w metodzie, w której zgłoszony jest wyjątek, w przeciwnym razie kod nie zostanie skompilowany.

Aby utworzyć sprawdzony wyjątek, rozszerz od Wyjątek. Aby utworzyć niesprawdzony wyjątek, rozszerz RuntimeException.

Każda metoda, która zgłasza sprawdzony wyjątek, musi to zaznaczyć w sygnaturze metody przy użyciu rzuca słowo kluczowe. Od czasu wbudowania Java IOException jest sprawdzonym wyjątkiem, następujący kod nie zostanie skompilowany:

public void wontCompile () //… if (someCondition) wyrzuć nowy IOException ();  //…

Najpierw musisz zadeklarować, że zgłasza sprawdzony wyjątek:

public void willCompile () zgłasza wyjątek IOException //… if (someCondition) wyrzuca nowy wyjątek IOException ();  //…

Zauważ, że metodę można zadeklarować jako zgłaszającą wyjątek, ale nigdy tak naprawdę nie zgłaszaj wyjątku. Mimo to wyjątek nadal będzie wymagał przechwycenia, w przeciwnym razie kod nie zostanie skompilowany.

Kiedy należy używać zaznaczonych lub niezaznaczonych wyjątków?

Oficjalna dokumentacja Java ma stronę z tym pytaniem. Różnicę podsumowuje zwięzła zasada: “Jeśli można zasadnie oczekiwać, że klient wyzdrowieje z wyjątku, uczyń go sprawdzonym wyjątkiem. Jeśli klient nie może nic zrobić w celu odzyskania od wyjątku, uczyń z niego niesprawdzony wyjątek.”

Ale te wytyczne mogą być nieaktualne. Z jednej strony sprawdzone wyjątki powodują, że kod jest bardziej niezawodny. 10 Porad do pisania Cleaner i lepszego kodu 10 Porad do pisania Cleaner i lepszego kodu Pisanie czystego kodu wygląda łatwiej niż jest w rzeczywistości, ale korzyści są tego warte. Oto, jak możesz zacząć pisać czystszy kod już dziś. . Z drugiej strony, żaden inny język nie sprawdził wyjątków w taki sam sposób jak Java, co pokazuje dwie rzeczy: po pierwsze, funkcja nie jest wystarczająco przydatna, aby inne języki mogły ją ukraść, a po drugie, możesz bez niej żyć. Ponadto sprawdzone wyjątki nie działają dobrze z wyrażeniami lambda wprowadzonymi w Javie 8.

Wytyczne dotyczące stosowania wyjątków Java

Wyjątki są przydatne, ale łatwo nadużywane i nadużywane. Oto kilka wskazówek i najlepszych praktyk, które pomogą Ci uniknąć bałaganu.

  • Preferuj szczególne wyjątki od wyjątków ogólnych. Posługiwać się NumberFormatException koniec IllegalArgumentException jeśli to możliwe, w przeciwnym razie użyj IllegalArgumentException koniec RuntimeException kiedy możliwe.
  • Nigdy nie łap Ogrzać! The Wyjątek klasa faktycznie się rozszerza Ogrzać, a blok catch faktycznie działa Ogrzać lub dowolna klasa rozszerzająca Throwable. Jednakże Błąd klasa również się rozszerza Ogrzać, i nigdy nie chcesz złapać Błąd bo Błąds wskazują poważne, niemożliwe do naprawienia problemy.
  • Nigdy nie łap Wyjątek! InterruptedException rozszerza się Wyjątek, więc każdy blok, który się łapie Wyjątek złapie również InterruptedException, i jest to bardzo ważny wyjątek, z którym nie chcesz zadzierać (szczególnie w aplikacjach wielowątkowych), chyba że wiesz, co robisz. Jeśli nie wiesz, który wyjątek przechwycić, rozważ, aby go nie złapać.
  • Użyj opisowych wiadomości, aby ułatwić debugowanie. Zgłaszając wyjątek, możesz podać Strunowy wiadomość jako argument. Dostęp do tej wiadomości można uzyskać w bloku catch za pomocą przycisku Exception.getMessage () , ale jeśli wyjątek nigdy nie zostanie wyłapany, komunikat pojawi się również jako część śladu stosu.
  • Staraj się nie wychwytywać i ignorować wyjątków. Aby obejść niedogodności związane ze sprawdzonymi wyjątkami, wielu początkujących i leniwych programistów ustawi blokadę, ale pozostawi ją pustą. Zły! Zawsze obsługuj go z wdziękiem, ale jeśli nie możesz, przynajmniej wydrukuj ślad stosu, aby wiedzieć, że wyjątek został zgłoszony. Możesz to zrobić za pomocą Exception.printStackTrace () metoda.
  • Uważaj na nadużywanie wyjątków. Kiedy masz młotek, wszystko wygląda jak gwóźdź. Kiedy po raz pierwszy dowiesz się o wyjątkach, możesz poczuć się zobowiązany do przekształcenia wszystkiego w wyjątek… do tego stopnia, że ​​większość przepływu kontroli aplikacji sprowadza się do obsługi wyjątków. Pamiętaj, że przewidziane są wyjątki “wyjątkowy” wystąpienia!

Teraz powinieneś czuć się wystarczająco komfortowo z wyjątkami, aby zrozumieć, czym one są, dlaczego są używane i jak włączyć je do własnego kodu. Jeśli nie rozumiesz w pełni tej koncepcji, to w porządku! Zajęło mi to trochę czasu “Kliknij” w mojej głowie, więc nie czuję, że trzeba się spieszyć. 6 znaków, że nie jesteś programistą. 6 znaków, że nie jesteś programistą. Nie wszyscy są programistami. Jeśli nie masz całkowitej pewności, że chcesz zostać programistą, oto kilka znaków, które mogą skierować Cię w dobrym kierunku. . Nie spiesz się.

Masz jakieś pytania? Czy znasz jakieś inne wskazówki związane z wyjątkami, które przegapiłem? Udostępnij je w komentarzach poniżej!




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.