CodeGym /Java блог /Случаен /Изключения: проверени, непроверени и персонализирани
John Squirrels
Ниво
San Francisco

Изключения: проверени, непроверени и персонализирани

Публикувано в групата
здрасти В последния урок се запознахме с изключенията в езика Java и видяхме примери How да работим с тях. Днес ще разгледаме по-задълбочено структурата на изключенията и ще се научим How да пишем собствени изключения :)

Видове изключения

Както казахме по-рано, в Java има много изключения, почти 400! Но всички те са разделени на групи, така че е доста лесно да ги запомните. Ето How изглежда: Изключения: проверени, непроверени и персонализирани - 2 Всички изключения имат общ прародител в Throwableкласа. От него се извличат две големи групи: изключения ( Exception ) и грешки ( Error ). Грешка - Това представлява критична грешка по време на изпълнение, свързана с работата на виртуалната машина на Java. В повечето случаи грешката не трябва да се обработва, тъй като показва някои сериозни пропуски в codeа. Най-известните от тях са StackOverflowError (това се случва, например, когато метод се извиква безкрайно) и OutOfMemoryError(това се случва, когато няма достатъчно памет за създаване на нови обекти). Както можете да видите, в тези ситуации обикновено няма абсолютно нищо за обработка по време на изпълнение: codeът просто е написан неправилно и трябва да бъде преработен. Изключение - Това представлява, добре, изключение: изключителна, непланирана ситуация, която възниква, докато програмата работи. Те не са толкова сериозни, колкото грешката, но все пак изискват нашето внимание. Всички изключения са разделени на 2 вида: проверени и непроверени . Изключения: проверени, непроверени и персонализирани - 3 Всички проверени изключения са извлечени от Exceptionкласа. Какво означава "проверено"? Споменахме за това в последния урок: „Следователно компилаторът на Java знае най-често срещаните изключения и ситуациите, в които те могат да възникнат.“ Например, той знае, че ако codeът чете данни от файл, файлът лесно може да не съществува. И има много такива ситуации (които може да заключи). Съответно, компилаторът проверява нашия code предварително за наличието на тези потенциални изключения. Ако ги открие, няма да компorра codeа, докато не ги обработим or не ги хвърлим отново. Вторият вид изключение е „непроверено“. Те са извлечени от RuntimeExceptionкласа. Как се различават от проверените изключения? Изглежда, че има и много различни класове, получени отRuntimeException(които описват изключения по време на изпълнение). Разликата е, че компилаторът не предвижда тези грешки. Изглежда, че казва: „Когато codeът беше написан, не открих нищо подозрително, но нещо се обърка, докато се изпълняваше. Очевидно има грешки в codeа!“ И наистина това е вярно. Непроверените изключения най-често са резултат от програмни грешки. И компилаторът очевидно не може да предвиди всяка възможна лоша ситуация, която хората могат да създадат със собствените си ръце. :) Следователно, той не проверява дали такива изключения се обработват в нашия code. Вече сте срещнали няколко непроверени изключения:
  • При деление на нула възниква ArithmeticException
  • ArrayIndexOutOfBoundsException възниква, когато се опитате да получите достъп до позиция извън масива.
Разбира се, можете да си представите, че създателите на Java можеха да въведат задължителна обработка на изключения, но в този случай codeът би бил твърде сложен. За всяка операция за деление трябва ли да напишете try-catchблок, за да проверите дали случайно сте разделor на нула? Всеки път, когато имате достъп до масив, ще трябва да напишете try-catchблок, за да проверите дали вашият индекс е извън границите. Всичко ще бъде спагети code и ще бъде напълно нечетливо. Логично е, че тази идея беше изоставена. В резултат на това непроверените изключения не е необходимо да се обработват на try-catchблокове or да се хвърлят отново (въпреки че това е технически възможно, Howто при Error).

Как да хвърлите собствено изключение

Разбира се, създателите на Java не могат да предвидят всяка изключителна ситуация, която може да възникне в програмите. В света има твърде много програми и те са твърде разнообразни. Но това не е повод за безпокойство, защото можете да създадете свое собствено изключение, ако е необходимо. Това е много лесно да се направи. Всичко, което трябва да направите, е да създадете свой собствен клас. Трябва да сте сигурни, че името му завършва с „Изключение“. Компилаторът не изисква това, но други програмисти, които четат вашия code, веднага ще разберат, че това е клас изключение. Освен това посочете, че класът е наследен от Exceptionкласа (компилаторът изисква това). Да предположим например, че имаме Dogклас. Можем да разхождаме кучето с помощта наwalk()метод. Но преди да направим това, трябва да проверим дали нашият домашен любимец носи нашийник, каишка и намордник. Ако нещо от това оборудване липсва, ние хвърляме собствено изключение: DogIsNotReadyException . Кодът му изглежда така:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
За да посочите, че класът е изключение, трябва да напишете " extends Exception " след името на класа (това означава "класът е извлечен от класа Exception"). В конструктора ние просто извикваме Exceptionконструктора на класа със съобщението String (ако възникне изключение, ще покажем съобщението, описание на грешката, на потребителя). Ето How изглежда това в codeа на нашия клас:

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("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
Сега нашият walk()метод хвърля DogIsNotReadyException . Това става с ключовата дума throw. Както казахме по-рано, изключение е обект. Така че, когато възникне изключение (на кучето липсва нещо) в нашия метод, ние създаваме нов DogIsNotReadyExceptionобект и го хвърляме, използвайки ключовата дума throw. Добавяме " хвърля DogIsNotReadyException " към декларацията на метода. С други думи, сега компилаторът е наясно, че извикването на walk()метода може да се превърне в изключителна ситуация. Съответно, това изключение трябва да бъде обработено, ако извикаме този метод някъде в нашата програма. Нека се опитаме да направим това в main()метода:

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
Това няма да се компorра. Изключението не се обработва! Увиваме нашия code в try-catchблок, за да се справим с изключението:

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
Сега нека да разгледаме изхода от конзолата: Яката е включена! Муцуната е включена! Готвим се за разходка! Бъди не е готов за разходка! Проверете екипировката! Проверка на екипировката! Яката сложена ли е? вярно ли е каишката? невярно дулото включено ли е? вярно Вижте колко по-информативен беше изходът на конзолата! Виждаме всяка предприета стъпка в програмата; виждаме къде е възникнала грешката и можем веднага да видим Howво точно липсва на нашето куче. :) И така си създавате изключения. Както можете да видите, няма нищо сложно в това. И въпреки че създателите на Java не си направиха труда да включат в езика специално изключение за лошо оборудвани кучета, ние поправихме техния пропуск. :)
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION