JavaRush /Блоги Java /Random-TG /Истисноҳо ва коркарди онҳо
articles
Сатҳи

Истисноҳо ва коркарди онҳо

Дар гурӯҳ нашр шудааст
Истисноҳо ё ҳолатҳои истисноӣ (ҳолатҳо) хатогиҳое мебошанд, ки дар барнома ҳангоми кори он рух медиҳанд. Ҳама истисноҳо дар Java an objectҳо мебошанд. Аз ин рӯ, онҳо метавонанд на танҳо ҳангоми рух додани вазъияти истисноӣ ба таври худкор тавлид карда шаванд, балки аз ҷониби худи таҳиякунанда низ эҷод карда шаванд. Иерархияи синфҳои истисноӣ: Истисноҳо ва коркарди онҳо - 1Истисноҳо ба якчанд синфҳо тақсим мешаванд, аммо ҳамаи онҳо аҷдоди умумӣ доранд - синф Throwable. Наслҳои он зерсинфҳо Exceptionва Error. Истисноҳо ( Exceptions) натиҷаи мушкилот дар барнома мебошанд, ки аслан ҳалшаванда ва пешгӯишаванда мебошанд. Масалан, тақсим ба сифр дар ададҳои бутун ба амал омад. Хатогиҳо ( Errors) мушкилоти ҷиддитаре мебошанд, ки дар мушаххасоти Java гуфта мешавад, ки шумо набояд кӯшиш кунед, ки дар барномаи худ ҳал кунед, зеро онҳо мушкилоти сатҳи JVM мебошанд. Масалан, истисноҳои ин гуна ҳолатҳо ба амал меоянд, ки хотираи дастрас барои мошини виртуалӣ тамом шавад. Барнома то ҳол наметавонад хотираи иловагиро барои JVM таъмин кунад. Дар Java, ҳама истисноҳо ба се намуд тақсим мешаванд: истисноҳои тафтишшуда ( checked) ва истисноҳои тафтишнашуда ( unchecked), ки хатогиҳоро ( Errors) ва истисноҳои вақти иҷроро дар бар мегиранд ( RuntimeExceptionsнасли синф Exception). Истисноҳои назоратшаванда хатогиҳое мебошанд, ки метавонанд дар барнома коркард шаванд ва бояд ҳал карда шаванд; ҳамаи наслҳои синф Exception(вале не RuntimeException) ба ин намуд тааллуқ доранд. Коркарди истисноро метавон бо истифода аз операторҳо анҷом дод try…catchё ба қисми берунии барнома интиқол дод. Масалан, усул метавонад истисноҳоеро, ки дар иерархияи занг баландтар дар он рух медиҳанд, бидуни коркарди худ гузарад. Истисноҳои тафтишнашуда коркардро талаб намекунанд, аммо агар шумо хоҳед, шумо метавонед истисноҳои синфро ҳал кунед RuntimeException. Биёед барномаи зеринро тартиб диҳем ва иҷро кунем:
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
Ҳангоми оғозёбӣ, дар консол паёми зерин нишон дода мешавад:
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
Паём синфи истисноеро, ки рух додааст, нишон медиҳад - ArithmeticException. Ин истисноро метавон ҳал кард:
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
Акнун, ба ҷои паёми хатогии стандартӣ, блок иҷро карда мешавад catch, ки параметри он an objectи e синфи ба истисно мувофиқ аст (ба худи an object метавонад ҳама гуна ном дода шавад, агар мо онро маҷбуран партоем, он лозим мешавад. ин истисно боз, масалан, ба тавре ки он ягон коркардкунандаи дигар тафтиш карда мешавад). Дар ин ҳолат, блок tryпорчаи барномаро дар бар мегирад, ки дар он истисно эҳтимолан рух дода метавонад. Яке tryметавонад ба якчанд блокҳои сайд бо синфҳои истисноии гуногун мувофиқат кунад.
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 ё 2 ворид шавад, барнома бидуни эҷоди ягон истисно кор мекунад. Агар корбар 0-ро ворид кунад, истиснои синф ба амал меояд ArithmeticExceptionва аз ҷониби блоки аввал идора карда мешавад catch. Агар корбар 3-ро ворид кунад, истиснои синф ба амал меояд ArrayIndexOutOfBoundsException(массиви берун аз ҳудуди) ва он аз ҷониби блоки дуюм коркард мешавад catch. Агар корбар рақами ғайритаъминро ворид кунад, масалан, 3.14, он гоҳ истиснои синф ба амал меояд InputMismatchException(мутобиқати навъи вуруд) ва он дар формати хатои стандартӣ партофта мешавад, зеро мо онро ба ҳеҷ ваҷҳ коркард накардаем. Бо вуҷуди ин, шумо метавонед коркардкунандаро барои синф илова кунед 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, мо ҳеҷ гоҳ паёми хатогиро намебинем, ғайр аз "Баъзе истиснои дигар рух дод" (ҳамаи истисноҳо фавран аз ҷониби ин блок дастгир карда мешаванд ва ба он намерасанд. дигарон). Иловаи ихтиёрӣ ба блокҳо try…catchметавонад блок бошад finally. Фармонҳои дар он ҷойгиршуда дар ҳар сурат, новобаста аз он ки истисно рух медиҳад ё не, иҷро карда мешавад. Сарфи назар аз он, ки вақте ки истиснои коркарднашаванда рух медиҳад, қисми барнома пас аз тавлиди ин истисно иҷро карда намешавад. Масалан, агар дар давоми баъзе ҳисобҳои тӯлонӣ истисно рух дода бошад, finallyшумо метавонед натиҷаҳои мобайниро дар блок нишон диҳед ё захира кунед. Истинод ба манбаъ: Истисноҳо ва коркарди онҳо
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION