JavaRush /Java Blog /Random-TL /Mga pagbubukod at ang kanilang paghawak
articles
Antas

Mga pagbubukod at ang kanilang paghawak

Nai-publish sa grupo
Ang mga eksepsiyon o pambihirang sitwasyon (mga estado) ay mga error na nagaganap sa isang programa sa panahon ng operasyon nito. Ang lahat ng mga pagbubukod sa Java ay mga bagay. Samakatuwid, ang mga ito ay maaaring mabuo hindi lamang awtomatikong kapag ang isang pambihirang sitwasyon ay nangyari, ngunit nilikha din ng developer mismo. Hierarchy ng mga klase sa pagbubukod: Исключения и их обработка - 1Ang mga pagbubukod ay nahahati sa ilang mga klase, ngunit lahat sila ay may iisang ninuno - ang klase Throwable. Ang mga inapo nito ay ang mga subclass Exceptionat Error. Ang mga pagbubukod ( Exceptions) ay ang resulta ng mga problema sa isang programa na, sa prinsipyo, nalulusaw at nahuhulaan. Halimbawa, ang paghahati sa pamamagitan ng zero ay naganap sa mga integer. Ang mga error ( Errors) ay mas malalang problema na isinasaad ng espesipikasyon ng Java na hindi mo dapat subukang hawakan sa iyong sariling programa dahil ang mga ito ay mga problema sa antas ng JVM. Halimbawa, ang mga pagbubukod ng ganitong uri ay nangyayari kung ang memorya na magagamit sa virtual machine ay naubos na. Ang programa ay hindi pa rin makakapagbigay ng karagdagang memorya para sa JVM. Sa Java, ang lahat ng mga eksepsiyon ay nahahati sa tatlong uri: may check na mga eksepsiyon ( checked) at hindi naka-check na mga eksepsiyon ( unchecked) na kinabibilangan ng mga error ( Errors) at run-time na mga eksepsiyon ( RuntimeExceptionsclass descendant Exception). Ang mga kinokontrol na pagbubukod ay mga error na maaari at dapat pangasiwaan sa isang programa; lahat ng mga inapo ng isang klase Exception(ngunit hindi RuntimeException) ay nabibilang sa ganitong uri. Ang paghawak ng eksepsiyon ay maaaring gawin gamit ang mga operator try…catcho ilipat sa panlabas na bahagi ng programa. Halimbawa, ang isang paraan ay maaaring pumasa sa mga pagbubukod na nagaganap dito nang mas mataas sa hierarchy ng tawag nang hindi ito pinangangasiwaan mismo. Ang mga hindi na-check na exception ay hindi nangangailangan ng paghawak, ngunit maaari mong pangasiwaan ang mga exception sa klase kung gusto mo RuntimeException. I-compile at patakbuhin natin ang sumusunod na programa:
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
Kapag inilunsad, ang sumusunod na mensahe ay ipapakita sa console:
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
Ipinapakita ng mensahe ang klase ng exception na naganap - ArithmeticException. Ang pagbubukod na ito ay maaaring pangasiwaan:
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
Ngayon, sa halip na isang karaniwang mensahe ng error, isang bloke ang isasagawa catch, ang parameter na kung saan ay ang object e ng klase na naaayon sa pagbubukod (ang object mismo ay maaaring bigyan ng anumang pangalan, kakailanganin ito kung gusto nating puwersahang itapon ang pagbubukod na ito muli, halimbawa, upang ito ay masuri sa ibang tagapangasiwa). Sa kasong ito, ang block tryay naglalaman ng fragment ng programa kung saan ang isang pagbubukod ay posibleng mangyari. Ang isa tryay maaaring tumutugma sa ilang mga catch block na may iba't ibang klase ng exception.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
Если запустив представленную программу, пользователь введётся с клавиатуры 1 or 2, то программа отработает без создания Howих-либо исключений. Если пользователь введёт 0, то возникнет исключение класса ArithmeticException, и оно будет обработано первым блоком catch. Если пользователь введёт 3, то возникнет исключение класса ArrayIndexOutOfBoundsException (выход за приделы массива), и оно будет обработано вторым блоком catch. Если пользователь введёт нецелое число, например, 3.14, то возникнет исключение класса InputMismatchException (несоответствие типа вводимого meaning), и оно будет выброшено в формате стандартной ошибки, поскольку его мы ниHow не обрабатывали. Можно, однако, добавить обработчик для класса Exception, поскольку этот класс родительский для всех остальных контролируемых исключений, то он будет перехватывать любые из них (в том числе, и InputMismatchException).
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
Поскольку исключения построены на иерархии классов и подклассов, то сначала надо пытаться обработать более частные исключения и лишь затем более общие. То есть поставив первым (а не третьим) блок с обработкой исключения класса Exception, мы бы никогда не увидели ниHowих сообщений об ошибке, кроме «Произошло ещё Howое-то исключение» (все исключения перехватorсь бы сразу этим блоком и не доходor бы до остальных). Необязательным добавлением к блокам try…catch может быть блок finally. Помещенные в него команды будут выполняться в любом случае, вне зависимости от того, произошло ли исключение or нет. При том, что при возникновении необработанного исключения оставшаяся после генерации этого исключения часть программы — не выполняется. Например, если исключение возникло в процессе Howих-то длительных вычислений, в блоке finally можно показать or сохранить промежуточные результаты. Ссылка на первоисточник: Исключения и их обработка
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION