JavaRush /Блоги Java /Random-TG /Истисноҳо дар Java (истиснои Java)

Истисноҳо дар Java (истиснои Java)

Дар гурӯҳ нашр шудааст
Дар ҳаёти ҳаррӯза баъзан ҳолатҳое ба миён меоянд, ки мо онҳоро ба нақша нагирифтаем. Масалан, шумо саҳар ба кор мехезед, барои телефони худ пуркунандаи барқро меҷӯед, аммо нест. Барои шустани рӯй ба ҳаммом меравед - об хомӯш шудааст. Ман ба мошин савор шудам ва он сар намешуд. Аммо шахс метавонад бо чунин ҳолатҳои ғайричашмдошт хеле осон мубориза барад. Мо кӯшиш хоҳем кард, ки дар ин мақола чӣ гуна барномаҳои Java бо онҳо кор мекунанд.

Истисноҳои java кадомҳоянд

Дар олами барномасозй хангоми ичрои программа рух додани хатогихо ва холатхои гайричашмдоштро истисно меноманд. Дар барнома истисноҳо метавонанд дар натиҷаи амалҳои нодурусти корбар, набудани манбаи зарурӣ дар диск ё аз байн рафтани пайвастшавӣ ба server тавассути шабака ба амал оянд. Истисноҳо ҳангоми иҷрои барнома инчунин метавонанд аз хатогиҳои барномасозӣ ё истифодаи нодурусти API ба амал оянд. Баръакси ҷаҳони мо, барнома бояд равшан бидонад, ки дар чунин вазъият чӣ кор кардан лозим аст. Java механизми истисноиро барои ин мақсад пешниҳод мекунад.

Ба таври мухтасар дар бораи калимаҳои калидӣ кӯшиш кунед, сайд кунед, ниҳоят партоед

Коркарди истисно дар Java ба истифодаи калимаҳои зерин дар барнома асос ёфтааст:
  • кӯшиш - блоки codeро муайян мекунад, ки дар он истисно метавонад рух диҳад;
  • catch - блоки codeро муайян мекунад, ки дар он истисно кор карда мешавад;
  • ниҳоят - блоки codeро муайян мекунад, ки ихтиёрӣ аст, аммо агар мавҷуд бошад, новобаста аз натиҷаҳои блоки кӯшиш ба ҳар ҳол иҷро карда мешавад.
Ин калимаҳои калидӣ барои сохтани конструксияҳои махсуси коркард дар codeи барнома истифода мешаванд: try{}catch, try{}catch{}nihoyat, try{}nihoyat{}.
  • партофтан — барои баланд бардоштани истисно истифода мешавад;
  • партофтан - дар имзоҳои метод истифода мешавад, то огоҳ кунад, ки усул метавонад истисноро партофт.
Намунаи истифодаи калимаҳои калидӣ дар барномаи Java:
//method reads a string from the keyboard

public String input() throws MyException {//warn with throws,
// that the method can throw MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// in the try block we enclose the code in which an exception can occur, in this
// if the compiler tells us that the readLine() method of the class
// BufferedReader may throw an I/O exception
    try {
        s = reader.readLine();
// in the catch block we enclose the code for handling the IOException exception
    } catch (IOException e) {
        System.out.println(e.getMessage());
// close the read stream in the finally block
    } finally {
// when closing the stream, an exception is also possible, for example, if it was not opened, so we “wrap” the code in a try block
        try {
            reader.close();
// write exception handling when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// we decided that an empty string could disrupt the work of our program in the future, for example, on the result of this method, we need to call the substring(1,2) method, so we are forced to interrupt the program execution with the generation of our exception type MyException using throw
        throw new MyException("String can not be empty!");
    }
    return s;
}

Чаро ба мо механизми истисно лозим аст?

Биёед як мисоли воқеии ҷаҳонро бубинем. Тасаввур кунед, ки дар роҳи автомобилгард қитъае мавҷуд аст, ки дорои пули фавқулодда бо иқтидори бори маҳдуд аст. Агар мошине, ки массааш аз иқтидори борбардории купрук зиёд бошад, аз болои он ҳаракат кунад, он метавонад фурӯ ғалтад ва вазъияти ронанда метавонад, нарм карда гуем, истисноӣ гардад. Барои пешгирй кардани ин ходиса хизмати рох пешакй дар сари рох аломатхои огохкунанда насб мекунад. Ронандаи мошин ба аломати огоҳкунанда нигоҳ карда, вазни мошинашро бо вазни мошинаш барои ҳаракат дар купрук муқоиса мекунад. Агар аз он зиёд бошад, вай рохи гардишро пеш мегирад. Ба шарофати амалиёти хадамоти роҳ ба ронандагони мошинҳои боркаш, аввалан, имкон дода шуд, ки хатсайри худро пешакӣ тағйир диҳанд, дуюм, онҳо дар бораи хатар дар роҳи асосӣ огоҳ карда шуданд ва дар ниҳоят, аз имконнопазирии истифода огоҳ карда шуданд. купрук дар шароити муайян.
Исключения в Java - 2
Қобorяти пешгирӣ ва ҳал кардани истисно дар барнома, то он ки он идома ёбад, яке аз сабабҳои истифодаи истисноҳо дар Java мебошад. Механизми истисно инчунин ба шумо имкон медиҳад, ки рамзи навиштаатон (интерфейси барномасозӣ) аз сӯиистифода аз ҷониби корбар тавассути тасдиқи (тафтиш) маълумоти воридотӣ муҳофизат кунед. Акнун биёед як сония ГАИ бошем. Аввалан, шумо бояд ҷойҳоеро бидонед, ки ронандагон метавонанд ба мушкилот дучор шаванд. Дуюм, шумо бояд аломатҳои огоҳкунанда омода ва насб кунед. Нихоят, шумо бояд дар сурати ба вучуд омадани хатар дар рохи асосй роххои гардишро таъмин кунед. Дар Java, механизми истисно низ ҳамин тавр кор мекунад. Дар марҳилаи таҳияи барнома, мо бо истифода аз блоки try{} қисмҳои хатарноки codeро аз истисноҳо "муҳофизат мекунем", бо истифода аз блоки catch{} роҳҳои "захира"-ро таъмин мекунем ва дар блоки ниҳоят{} мо codeеро менависем, ки дар блок иҷро карда мешавад. барнома барои ҳама гуна натиҷа. Дар ҳолатҳое, ки мо наметавонем "маршри фавқулодда" пешниҳод кунем ё дидаву дониста интихобро ба корбар вогузор кунем, мо бояд ҳадди аққал ӯро дар бораи хатар огоҳ кунем. Чаро? Тасаввур кунед, ки ғазаби ронандае, ки ба пули фавқулода мерасад, ки бидуни дучор шудан ба як аломати огоҳкунанда дар роҳ убур кардан мумкин нест! Дар барномасозӣ, ҳангоми навиштани дарсҳо ва усулҳои мо, мо наметавонем ҳамеша контексти истифодаи онҳоро аз ҷониби дигар таҳиягарон дар барномаҳои худ пешбинӣ кунем, аз ин рӯ мо наметавонем роҳи дурусти 100% барои ҳалли вазъияти истисноро пешбинӣ кунем. Ҳамзамон, таҷрибаи хуб аст, ки истифодабарандагони codeекси моро дар бораи эҳтимолияти истисно огоҳ кунед. Механизми истисноии Java ба мо имкон медиҳад, ки ин корро бо истифода аз партовҳо анҷом диҳем - аслан рафтори умумии усули мо барои партофтани истисно эълон карда мешавад ва ба ин васила онро ба корбари усули навиштани code барои коркарди истисно дар Java вогузор мекунад.

Огоҳӣ аз "мушкилот"

Вақте ки шумо нақшаи коркарди истисноро дар усули худ надоред, аммо мехоҳед корбаронро аз усул дар бораи ҳолатҳои истисноии эҳтимолӣ огоҳ кунед, калимаи калидии throws -ро истифода баред. Ин калимаи калидӣ дар имзои метод маънои онро дорад, ки дар шароити муайян усул метавонад истисноро ба вуҷуд орад. Ин огоҳӣ як қисми интерфейси усул аст ва ба корбар ҳуқуқ медиҳад, ки татбиқи коркарди истисноро танзим кунад. Пас аз партофтан мо навъи истиснои партофташударо нишон медиҳем. Инҳо одатан насли синфи истисноии Java мебошанд . Азбаски Java забони ба an object нигаронидашуда аст, ҳама истисноҳо дар Java an objectҳо мебошанд.
Исключения в Java - 3

Иерархияи истисноии Java

Вақте ки ҳангоми иҷрои барнома хатогӣ рух медиҳад, вақти иҷрои JVM an objectи навъи лозимиро аз иерархияи истисноии Java эҷод мекунад - маҷмӯи истисноҳои имконпазире, ки аз "аҷдод" -и умумӣ мерос гирифта шудаанд - синфи Throwable. Ҳолатҳои истисноие, ки дар барнома рух медиҳанд, метавонанд ба ду гурӯҳ тақсим карда шаванд:
  1. Ҳолатҳое, ки дар он барқарорсозии фаъолияти мӯътадor минбаъдаи барнома имконнопазир аст
  2. Барқароршавӣ имконпазир аст.
Ба гурӯҳи аввал ҳолатҳое дохил мешаванд, ки истисноҳои аз синфи Error мерос гирифташуда рух медиҳанд . Инҳо хатогиҳое мебошанд, ки ҳангоми иҷрои барнома дар натиҷаи нокомии JVM, пур шудани хотира ё садамаи система ба вуҷуд меоянд. Онҳо одатан мушкилоти ҷиддиеро нишон медиҳанд, ки онҳоро бо истифодаи нармафзор ҳал кардан мумкин нест. Ин навъи истисно дар Java дар марҳилаи тартибдиҳӣ ҳамчун истисно тасниф карда мешавад. Ин гурӯҳ инчунин RuntimeException - истисноҳо, ворисони синфи Exception -ро дар бар мегирад , ки аз ҷониби JVM ҳангоми иҷрои барнома тавлид шудааст. Онҳо аксар вақт аз хатогиҳои барномасозӣ ба вуҷуд меоянд. Ин истисноҳо дар вақти тартибдиҳӣ низ тафтиш карда намешаванд, аз ин рӯ навиштани code барои коркарди онҳо шарт нест. Ба гурӯҳи дуюм ҳолатҳои истисноӣ дохил мешаванд, ки дар марҳилаи навиштани барнома пешбинӣ шудаанд ва барои онҳо codeи коркард бояд навишта шавад. Чунин истисноҳо тафтиш карда мешаванд. Қисми асосии кори таҳиягари Java ҳангоми кор бо истисноҳо ҳалли чунин ҳолатҳо мебошад.

Эҷоди истисно

Ҳангоми иҷрои барнома, истисно аз ҷониби JVM ё дастӣ бо истифода аз баёнияи throw . Ин дар хотира an objectи истисноиро эҷод мекунад ва иҷрои рамзи асосии барномаро қатъ мекунад, дар ҳоле ки коркардкунандаи истиснои JVM кӯшиш мекунад, ки роҳи коркарди истисноро пайдо кунад.

Муносибати истисно

Эҷоди блокҳои code, ки барои онҳо мо коркарди истисноиро дар Java таъмин мекунем, дар барнома бо истифода аз конструксияҳои try{}catch, try{}catch{}nihoyat, try{}nihoyat{} анҷом дода мешавад.
Исключения в Java - 4
Вақте ки истисно дар блоки озмоишӣ эҷод карда мешавад, коркардкунандаи истисно дар блоки зерини сайд ҷустуҷӯ карда мешавад. Агар сайд барои ин намуди истисно коркардкунанда дошта бошад, назорат ба он мегузарад. Дар акси ҳол, JVM то пайдо шудани сайди мувофиқ коркардкунандаро барои ин навъи истисно дар силсилаи зангҳои метод меҷӯяд. Пас аз иҷро шудани блоки сайд, назорат ба блоки ихтиёрии ниҳоӣ интиқол дода мешавад . Агар блоки мувофиқи сайд пайдо нашавад, JVM иҷрои барномаро қатъ мекунад ва стеки зангҳои методиро намоиш медиҳад - stack trace , ки қаблан рамзи блоки ниҳоиро, агар мавҷуд бошад, иҷро карда буд. Намунаи коркарди истисно:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside method print: " + s);
    }

    public static void main(String[] args) {
        Print print = new Print();
        List list= Arrays.asList("first step", null, "second step");

        for (String s:list) {
            try {
                print.print(s);
            }
            catch (NullPointerException e) {
                System.out.println(e.getMessage());
                System.out.println("Exception was processed. Program continues");
            }
            finally {
                System.out.println("Inside bloсk finally");
            }
            System.out.println("Go program....");
            System.out.println("-----------------");
        }

    }
    }
Натиҷаҳои усули асосӣ :
Inside method print: first step
Inside bloсk finally
Go program....
-----------------
Exception: s is null!
Exception was processed. Program continues
Inside bloсk finally
Go program....
-----------------
Inside method print: second step
Inside bloсk finally
Go program....
-----------------
Блок finallyодатан барои бастани ҷараёнҳои дар блоки озмоишӣ кушодашуда ё озод кардани захираҳо истифода мешавад. Аммо, ҳангоми навиштани барнома, на ҳама вақт имкон дорад, ки ҳама захираҳо баста шаванд. Барои осон кардани зиндагии мо, таҳиягарони Java ба мо сохтеро пешниҳод карданд try-with-resources, ки ба таври худкор захираҳои дар блоки озмоиш кушодашударо мепӯшонад. Намунаи аввалини моро метавон чунин навишт try-with-resources:
public String input() throws MyException {
    String s = null;
    try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
        s = reader.readLine();
   } catch (IOException e) {
       System.out.println(e.getMessage());
   }
    if (s.equals("")){
        throw new MyException ("String can not be empty!");
    }
    return s;
}
Бо шарофати имкониятҳои Java, аз versionи 7 сар карда, мо инчунин метавонем сайди намудҳои гуногуни истисноҳоро дар як блок муттаҳид созем ва codeро зичтар ва хондашаванда гардонем. Барои намуна:
public String input() {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        s = reader.readLine();
        if (s.equals("")) {
            throw new MyException("String can not be empty!");
        }
    } catch (IOException | MyException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

Натиҷаҳо

Истифодаи истисноҳо дар Java ба мо имкон медиҳад, ки таҳаммулпазирии хатогиҳои барномаро тавассути истифодаи роҳҳои "захираӣ" афзоиш диҳем, мантиқи codeи асосиро аз codeи коркарди истисно тавассути истифодаи блокҳои сайд ҷудо кунем ва инчунин ба мо имкон медиҳад, ки вакилонро супорем. коркарди истисно ба корбари рамзи мо бо истифода аз партовҳо.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION