Reklama
Jako początkujący programista Jak nauczyć się programowania bez stresuMoże zdecydowałeś się kontynuować programowanie, czy to dla kariery, czy dla hobby. Wspaniały! Ale może zaczynasz czuć się przytłoczony. Nie za dobrze. Oto pomoc w ułatwieniu podróży. Czytaj więcej , koncepcja Obsługa wyjątków może być trudno owinąć głowę. Nie 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ć. Najbardziej nowoczesne języki 6 najłatwiejszych języków programowania dla początkującychNauka programowania polega na znalezieniu odpowiedniego języka tak samo, jak na procesie edycji. Oto sześć najpopularniejszych języków programowania dla początkujących. Czytaj więcej masz jakąś obsługę wyjątków, więc jeśli ty kiedykolwiek przechodziłem z Javy 7 przydatnych sztuczek do opanowania nowego języka programowania Podczas nauki kodowania możesz być przytłoczony. Prawdopodobnie zapomnisz o rzeczach tak szybko, jak się ich nauczysz. Te wskazówki pomogą ci lepiej zachować wszystkie nowe informacje. Czytaj więcej , 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, że podczas działania aplikacji wystąpiło coś nienormalnego (lub „wyjątkowego”). Takie są wyjątki rzucony, co w zasadzie oznacza, że tworzony jest obiekt wyjątku (podobnie jak „zgłaszanie błędów”).
Piękno polega na tym, że możesz łapać zgłoszone wyjątki, które pozwalają uporać się z nienormalnym stanem i umożliwić kontynuowanie działania aplikacji, jakby nic się nie stało. Na przykład, podczas gdy wskaźnik zerowy w C może spowodować awarię aplikacji, Java pozwala rzucać i łapać NullPointerException
s 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
. Podczas gdy Java ma wiele wbudowanych wyjątków, możesz także utworzyć własne, jeśli chcesz. Niektórych najczęstsze wyjątki Java zawierać:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
A co się stanie, gdy rzucisz wyjątek?
Po pierwsze, Java sprawdza bezpośrednią metodę, aby sprawdzić, czy istnieje 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 dopracowany 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 at com.example.myproject. Book.getTitle (Book.java: 16) w com.example.myproject. Author.getBookTitles (Autor.java: 25) na 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ą korzyścią z wyjątków jest to, że można „poradzić sobie” z nienormalnym stanem, 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óra przyjmuje liczbę całkowitą i wykonuje logikę, która mogłaby 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 (wartość <0 || wartość> 100) {wyrzuć nowy 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. Po zgłoszeniu wyjątku wszystkie kolejne instrukcje są pomijane, a logika aplikacji natychmiast przeskakuje do łapać blok.
W naszym przykładzie wchodzimy do bloku try i natychmiast wywołujemy someMethod ()
. Ponieważ 200 nie jest między 0 a 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 (). Kiedy someOtherMethod ()
kończy 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 (wyjątek 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ć oczyszczone 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 wszelkich niezbędnych porządków, jednocześnie umożliwiając zgłoszenie wyjątków w celu upowszechnienia metody stos wywołań (tzn. nie chcesz obsługiwać wyjątku tutaj, ale nadal musisz wyczyścić pierwszy).
Sprawdzone vs. Niezaznaczone wyjątki w Javie
W odróżnieniu od 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 dać się złapać metodzie, w której zgłoszony jest wyjątek, w przeciwnym razie kod się nie skompiluje.
Aby utworzyć sprawdzony wyjątek, rozciągnij od Wyjątek
. Aby utworzyć niesprawdzony wyjątek, rozszerz RuntimeException
.
Każda metoda, która zgłasza sprawdzony wyjątek, musi to oznaczyć w podpisie metody za pomocą 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) {wyrzuć nowy 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ł wychwycenia, w przeciwnym razie kod się nie skompiluje.
Kiedy należy stosować zaznaczone lub niezaznaczone wyjątki?
Oficjalna dokumentacja Java ma strona tego pytania. Różnicę podsumowuje zwięzła zasada: „Jeśli można oczekiwać, że klient wyjdzie z wyjątku, uczyń z niego sprawdzony wyjątek. 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 sprawdzane są wyjątki skutkować bardziej niezawodnym kodem 10 porad dotyczących pisania Cleaner & Better CodePisanie 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ś. Czytaj więcej . Z drugiej strony żaden inny język nie sprawdził wyjątków w taki sam sposób jak Java, która pokazuje dwie rzeczy: po pierwsze, funkcja ta nie jest wystarczająca, aby inne języki mogły ją ukraść, a po drugie, bez niej możesz żyć im. 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
nadIllegalArgumentException
jeśli to możliwe, w przeciwnym razie użyjIllegalArgumentException
nadRuntimeException
kiedy możliwe. -
Nigdy nie łap
Ogrzać
! TheWyjątek
klasa faktycznie się rozszerzaOgrzać
, a blok catch faktycznie działa zOgrzać
lub dowolna klasa rozszerzająca Throwable. JednakżeBłąd
klasa również się rozszerzaOgrzać
i nigdy nie chcesz złapaćBłąd
boBłąd
s 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ę łapieWyjątek
złapie równieżInterruptedException
, a to bardzo ważny wyjątek, z którym nie chcesz się bawić (szczególnie w aplikacjach wielowątkowych), chyba że wiesz, co robisz. Jeśli nie wiesz, który wyjątek złapać, 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ą przyciskuException.getMessage ()
, ale jeśli wyjątek nigdy nie zostanie złapany, komunikat pojawi się również jako część śledzenia 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 wyjątki dotyczą „wyjątkowych” zdarzeń!
Teraz powinieneś czuć się 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 dobrze! Trochę czasu zajęło mi „kliknięcie” w mojej głowie, więc nie czujesz, że musisz się spieszyć 6 znaków, że nie jesteś programistąNie każdy jest programistą. Jeśli nie masz całkowitej pewności, że chcesz zostać programistą, oto kilka znaków, które mogą skierować Cię w dobrym kierunku. Czytaj więcej . 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!
Joel Lee ma tytuł licencjata w informatyce i ponad sześć lat doświadczenia zawodowego w pisaniu. Jest redaktorem naczelnym MakeUseOf.