JavaRush /Blog Java /Random-PL /Wyjątki: zaznaczone, niesprawdzone i własne

Wyjątki: zaznaczone, niesprawdzone i własne

Opublikowano w grupie Random-PL
Cześć! Na ostatnim wykładzie zapoznaliśmy się z takim aspektem języka Java jak wyjątki i zobaczyliśmy przykłady pracy z nimi. Dziś przyjrzymy się bliżej ich strukturze, a także nauczymy się pisać własne wyjątki :)

Rodzaje wyjątków

Jak powiedzieliśmy, w Javie jest wiele klas wyjątków, prawie 400! Ale wszystkie są podzielone na grupy, więc dość łatwo je zapamiętać. Oto jak to wygląda: Wyjątki: zaznaczone, niesprawdzone i własne - 2Wszystkie wyjątki mają wspólną klasę przodków Throwable. Wywodzą się z niego dwie duże grupy - wyjątki (Exception) i błędy (Error). Błąd to krytyczny błąd podczas wykonywania programu, związany z działaniem wirtualnej maszyny Java. W większości przypadków błąd nie wymaga obsługi, ponieważ wskazuje na poważne błędy w kodzie. Najbardziej znane błędy: StackOverflowError- pojawiają się np. wtedy, gdy metoda wywołuje się w nieskończoność, oraz OutOfMemoryError- pojawiają się, gdy nie ma wystarczającej ilości pamięci, aby utworzyć nowe obiekty. Jak widać, w takich sytuacjach najczęściej nie ma nic specjalnego do przetworzenia - kod jest po prostu błędnie napisany i należy go przerobić. Wyjątki są w istocie wyjątkami: wyjątkową, niezaplanowaną sytuacją, która wydarzyła się w trakcie działania programu. Nie są to błędy tak poważne jak Błąd, ale wymagają naszej uwagi. Wszystkie wyjątki są podzielone na 2 typy – zaznaczone ( zaznaczone ) i niezaznaczone ( niezaznaczone ). Wyjątki: zaznaczone, niesprawdzone i własne - 3Wszystkie zaznaczone wyjątki pochodzą z pliku Exception. Co oznacza „weryfikowalne”? Częściowo wspominaliśmy o tym w ostatnim wykładzie : „...kompilator Java zna najczęstsze wyjątki i wie, w jakich sytuacjach mogą one wystąpić.” Wie na przykład, że jeśli programista odczyta dane z pliku w kodzie, łatwo może powstać sytuacja, że ​​plik nie istnieje. A takich sytuacji, które może przewidzieć z wyprzedzeniem, jest wiele. Dlatego kompilator sprawdza nasz kod z wyprzedzeniem pod kątem potencjalnych wyjątków. Jeśli je znajdzie, nie skompiluje kodu, dopóki ich nie przetworzymy lub nie przekażemy na górę. Drugi typ wyjątku to „niesprawdzony”. Pochodzą z zajęć RuntimeException. Czym różnią się od tych testowanych? Wydaje się, że istnieje również wiele różnych klas, które pochodzą RuntimeExceptioni opisują określone wyjątki środowiska wykonawczego. Różnica polega na tym, że kompilator nie spodziewa się tych błędów. Zdaje się mówić: „W momencie pisania kodu nie znalazłem niczego podejrzanego, ale coś poszło nie tak podczas jego działania. Najwyraźniej w kodzie są błędy!” I rzeczywiście tak jest. Niesprawdzone wyjątki są najczęściej skutkiem błędów programisty. A kompilator najwyraźniej nie jest w stanie uwzględnić wszystkich możliwych błędnych sytuacji, jakie ludzie mogą stworzyć własnymi rękami :) Dlatego nie będzie sprawdzał obsługi takich wyjątków w naszym kodzie. Napotkałeś już kilka niesprawdzonych wyjątków:
  • ArithmeticExceptionwystępuje przy dzieleniu przez zero
  • ArrayIndexOutOfBoundsExceptionWystępuje podczas próby uzyskania dostępu do komórki poza tablicą.
Teoretycznie oczywiście twórcy Javy mogli wprowadzić obowiązkową obsługę takich wyjątków, ale jaki byłby wtedy kod? Przy dowolnej operacji dzielenia liczb musiałbyś napisać funkcję try-catch, aby sprawdzić, czy przypadkowo dzielisz przez zero? Za każdym razem, gdy uzyskujesz dostęp do tablicy, musiałbyś napisać try-catch, aby sprawdzić, czy przekroczyłeś te limity. Każdy napisany kod byłby spaghetti i całkowicie nieczytelny. Logiczne jest, że pomysł ten został porzucony. Dlatego niesprawdzone wyjątki nie muszą być obsługiwane w blokach try-catch ani wyrzucane na górę, chociaż jest to technicznie możliwe, jak w przypadku błędu.

Jak rzucić wyjątek

Oczywiście twórcy Javy nie są w stanie przewidzieć wszystkich wyjątkowych sytuacji, jakie mogą zaistnieć w programach. Na świecie jest zbyt wiele programów i są one zbyt różne. Ale to jest w porządku, ponieważ w razie potrzeby możesz utworzyć własne wyjątki. Można to zrobić bardzo łatwo. Wszystko, co musisz zrobić, to stworzyć własną klasę. Jego nazwa musi kończyć się na „Wyjątek”. Kompilator tego nie potrzebuje, ale programiści czytający Twój kod natychmiast zrozumieją, że jest to klasa wyjątku. Dodatkowo należy wskazać, że klasa pochodzi z klasy Exception. Jest to już konieczne dla kompilatora i poprawnego działania. Na przykład mamy klasę Pies - Dog. Możemy wyprowadzać psa za pomocą walk(). Jednak wcześniej musimy sprawdzić czy nasz pupil ma na sobie obrożę, smycz i kaganiec. Jeśli brakuje któregokolwiek z nich, zgłosimy własny wyjątek DogIsNotReadyException. Jego kod będzie wyglądał następująco:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Aby wskazać, że dana klasa jest wyjątkiem, po nazwie klasy należy napisać rozszerzenie Exterion : oznacza to, że „klasa wywodzi się z klasy Wyjątek”. W konstruktorze po prostu wywołamy Exceptionlinijką konstruktor klasy message- wyświetli on użytkownikowi komunikat od systemu opisujący błąd, który nastąpił. Tak to będzie wyglądać w kodzie naszej klasy:
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println(„Kołnierzyk jest założony!”);
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("Smycz jest nałożona!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println(„Muszka jest włączona!”);
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Chodźmy na spacer!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println(„Hurra, chodźmy na spacer!” + name + " Cieszę się!");
   } else {
       throw new DogIsNotReadyException("Pies " + name + „Nie jesteś gotowy na spacer! Sprawdź swój sprzęt!”);
   }
 }

}
Teraz nasza metoda walk()zgłasza wyjątek DogIsNotReadyException. Odbywa się to za pomocą słowa kluczowego throw. Jak powiedzieliśmy wcześniej, wyjątek jest przedmiotem. Dlatego w naszej metodzie, gdy zdarzy się wyjątkowa sytuacja – psu czegoś brakuje – tworzymy nowy obiekt klasy DogIsNotReadyExceptioni wrzucamy go do programu za pomocą słowa throw. Do sygnatury metody walk()dodajemy rzuty DogIsNotReadyException. Innymi słowy, kompilator jest teraz świadomy, że wywołanie metody walk()może spowodować wyjątek. Jeśli więc wywołamy to gdzieś w programie, trzeba będzie obsłużyć wyjątek. Spróbujmy to zrobić metodą main():
public static void main(String[] args) {

   Dog dog = new Dog(„Mukhtar”);
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Nie kompiluje się, wyjątek nie został obsłużony! Zawińmy nasz kod w blok, try-catchaby obsłużyć wyjątek:
public static void main(String[] args) {

   Dog dog = new Dog(„Mukhtar”);
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println(„Sprawdzanie wyposażenia! Czy obroża jest założona?” + dog.isCollarPutOn + „\r\n Czy smycz jest zapięta?”
       + dog.isLeashPutOn + „\r\n Czy nosisz kaganiec?” + dog.isMuzzlePutOn);
   }
}
Przyjrzyjmy się teraz wynikom konsoli:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Zobacz, o ile bardziej informacyjne stały się dane wyjściowe konsoli! Widzimy każdy krok, który miał miejsce w programie; Widzimy gdzie pojawił się błąd i od razu zauważamy czego dokładnie brakuje naszemu psu :) W ten sposób tworzymy własne wyjątki. Jak widać nic skomplikowanego. I chociaż programiści Javy nie zadali sobie trudu dodania specjalnego wyjątku do swojego języka dla nieprawidłowo wyposażonych psów, poprawiliśmy ich niedopatrzenie :)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION