JavaRush /Java блогы /Random-KK /Java тіліндегі ерекшеліктер (Java Exception)

Java тіліндегі ерекшеліктер (Java Exception)

Топта жарияланған
Күнделікті өмірде кейде біз жоспарламаған жағдайлар туындайды. Мысалы, сіз таңертең жұмысқа тұрасыз, телефоныңызға зарядтағышты іздейсіз, бірақ ол жоқ. Сіз ваннаға бетіңізді жууға барасыз - су өшірілді. Мен көлікке отырдым, ол іске қосылмады. Бірақ адам мұндай күтпеген жағдайларды оңай жеңе алады. Біз осы мақалада Java бағдарламалары олармен қалай жұмыс істейтінін анықтауға тырысамыз.

Қандай ерекшеліктер java

Бағдарламалау әлемінде бағдарламаны орындау кезінде қателер мен күтпеген жағдайлардың пайда болуы ерекше жағдай деп аталады. Бағдарламада ерекше жағдайлар пайдаланушының қате әрекеттері, дискіде қажетті ресурстың болмауы немесе желі арқылы serverге қосылуды жоғалту нәтижесінде пайда болуы мүмкін. Бағдарламаны орындау кезіндегі ерекшеліктер бағдарламалау қателерінен немесе API дұрыс пайдаланбауынан да туындауы мүмкін. Біздің әлемнен айырмашылығы, бағдарлама мұндай жағдайда не істеу керектігін анық білуі керек. Java осы мақсат үшін ерекшелік механизмін ұсынады.

Кілт сөздер туралы қысқаша try, catch, endly, throws

Java тілінде ерекше жағдайларды өңдеу бағдарламада келесі кілт сөздерді пайдалануға негізделген:
  • try - ерекше жағдай орын алуы мүмкін code блогын анықтайды;
  • catch – ерекше жағдай өңделетін code блогын анықтайды;
  • ақырында – міндетті емес, бірақ бар болса, try блогының нәтижелеріне қарамастан бәрібір орындалатын code блогын анықтайды.
Бұл кілт сөздер бағдарлама codeында арнайы өңдеу құрылымдарын жасау үшін пайдаланылады: try{}catch, try{}catch{}finally, try{}finally{}.
  • throw – ерекше жағдайды көтеру үшін қолданылады;
  • throws – әдіс ерекше жағдайды шығаруы мүмкін екенін ескерту үшін әдіс қолтаңбаларында қолданылады.
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
Бағдарламадағы ерекше жағдайды болдырмау және оны жалғастыру үшін шешу мүмкіндігі Java тілінде ерекше жағдайларды пайдалану себептерінің бірі болып табылады. Ерекшелік механизмі сонымен қатар кіріс деректерді тексеру (тексеру) арқылы сіз жазған codeты (бағдарламалау интерфейсі) пайдаланушының теріс пайдалануынан қорғауға мүмкіндік береді. Енді бір сәт жол полициясы болайық. Біріншіден, сіз көлік жүргізушілерінің қиындықтарға тап болатын жерлерін білуіңіз керек. Екіншіден, ескерту белгілерін дайындап, орнату керек. Ақырында, негізгі бағытта қауіп төнген жағдайда айналма жолдарды қамтамасыз ету керек. Java тілінде ерекшелік механизмі ұқсас жұмыс істейді. Бағдарламаны әзірлеу сатысында try{} блогы арқылы codeтың қауіпті бөлімдерін ерекше жағдайлардан «қорғаймыз», catch{} блогын пайдаланып «сақтық көшірме» жолдарын қамтамасыз етеміз және соңында{} блогында орындалатын codeты жазамыз. кез келген нәтижеге арналған бағдарлама. «Төтенше жағдайды» қамтамасыз ете алмасақ немесе таңдауды пайдаланушыға әдейі қалдырғымыз келсе, біз оны кем дегенде қауіп туралы ескертуіміз керек. Неліктен? Жол бойында бірде-бір ескерту белгісін таппай өтпейтін апатты көпірге жеткен жүргізушінің ашуын елестетіп көріңізші! Бағдарламалауда, біздің сыныптар мен әдістерді жазғанда, біз әрқашан олардың бағдарламаларында басқа әзірлеушілердің пайдалану контекстін болжай алмаймыз, сондықтан біз ерекше жағдайды шешудің 100% дұрыс жолын болжай алмаймыз. Сонымен қатар, codeымызды пайдаланушыларды ерекше жағдайдың болуы туралы ескерту жақсы тәжірибе болып табылады. Java-ның ерекшелік механизмі мұны throws арқылы орындауға мүмкіндік береді — негізінен ерекше жағдайды шығару әдісіміздің жалпы әрекетін жариялайды, осылайша Java-дағы ерекше жағдайды өңдеу үшін code жазу әдісін пайдаланушыға қалдырады.

«Ақаулық» туралы ескерту

Әдісіңізде ерекше жағдайды өңдеуді жоспарламасаңыз, бірақ пайдаланушыларды ықтимал ерекше жағдайлар туралы әдіс туралы ескерткіңіз келсе, throws кілт сөзін пайдаланыңыз. Әдіс қолтаңбасындағы бұл кілт сөз белгілі бір жағдайларда әдіс ерекше жағдайды шығаруы мүмкін дегенді білдіреді. Бұл ескерту әдіс интерфейсінің бөлігі болып табылады және пайдаланушыға ерекше жағдай өңдеушісінің орындалуын теңшеу құқығын береді. Лақтырғаннан кейін біз лақтырылатын ерекшелік түрін көрсетеміз. Бұл әдетте Java Exception класының ұрпақтары . Java нысанға бағытталған тіл болғандықтан, Java тіліндегі барлық ерекшеліктер нысандар болып табылады.
Исключения в Java - 3

Java ерекшелік иерархиясы

Бағдарламаны орындау кезінде қате орын алған кезде, JVM орындалу уақыты Java ерекшелік иерархиясынан қажетті түрдегі нысанды жасайды - ортақ «атадан» мұраланған ықтимал ерекшеліктер жиынтығы - Throwable класы. Бағдарламада орын алатын ерекше жағдайларды екі топқа бөлуге болады:
  1. Бағдарламаның одан әрі қалыпты жұмысын қалпына келтіру мүмкін емес жағдайлар
  2. Қалпына келтіру мүмкін.
Бірінші топқа Error сыныбынан мұраланған ерекшеліктер орын алатын жағдайлар кіреді . Бұл JVM қатесі, жадтың толып кетуі немесе жүйенің бұзылуы нәтижесінде бағдарламаны орындау кезінде пайда болатын қателер. Олар әдетте бағдарламалық жасақтаманы пайдалану арқылы түзетілмейтін күрделі мәселелерді көрсетеді. Java тіліндегі ерекше жағдайдың бұл түрі компиляция сатысында белгіленбеген ретінде жіктеледі. Бұл топқа сонымен қатар RuntimeException кіреді - ерекше жағдайлар, бағдарламаны орындау кезінде JVM арқылы жасалған Exception класының мұрагерлері. Олар көбінесе бағдарламалау қателерінен туындайды. Бұл ерекшеліктер компиляция уақытында да тексерілмейді, сондықтан оларды өңдеу үшін code жазу қажет емес. Екінші топқа бағдарламаны жазу кезеңінде болжанатын және өңдеу codeы жазылуы тиіс ерекше жағдайлар жатады. Мұндай ерекшеліктер тексеріледі. Ерекшеліктермен айналысу кезінде Java әзірлеушісінің жұмысының негізгі бөлігі осындай жағдайларды өңдеу болып табылады.

Ерекше жағдай жасау

Бағдарламаны орындау кезінде ерекше жағдай JVM арқылы немесе throw операторы арқылы қолмен шығарылады . Бұл жадта ерекше жағдай нысанын жасайды және JVM ерекшелік өңдеушісі ерекше жағдайды өңдеу жолын табуға тырысқан кезде негізгі бағдарлама codeының орындалуын тоқтатады.

Ерекше жағдайды өңдеу

Біз Java тілінде ерекше жағдайларды өңдеуді қамтамасыз ететін code блоктарын жасау try{}catch, try{}catch{}finally, try{}finally{} конструкцияларын қолдану арқылы бағдарламада орындалады.
Исключения в Java - 4
Ерекшелік try блогында көтерілгенде, ерекше жағдай өңдегіші келесі catch блогында ізделеді. Егер аулау осы түрдегі ерекшелік үшін өңдегішті қамтыса, басқару оған өтеді. Әйтпесе, JVM қолайлы аулау табылмайынша, әдіс шақыруларының тізбегінен осы ерекшелік түріне арналған өңдеушіні іздейді. catch блогы орындалғаннан кейін басқару қосымша finally блогына беріледі . Сәйкес ұстау блогы табылмаса, JVM бағдарламаның орындалуын тоқтатады және егер бар болса, соңғы блок codeын бұрын орындаған sck 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әдетте try блогында ашылған ағындарды жабу немесе ресурстарды босату үшін пайдаланылады. Дегенмен, бағдарламаны жазу кезінде барлық ресурстардың жабылуын бақылау әрқашан мүмкін емес. Біздің өмірімізді жеңілдету үшін 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;
}
7-нұсқадан бастап Java мүмкіндіктерінің арқасында біз 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-дағы ерекше жағдайларды пайдалану «сақтық көшірме» жолдарын пайдалану арқылы бағдарламаның ақауларға төзімділігін арттыруға, catch блоктарын пайдалану арқылы негізгі codeтың логикасын ерекшеліктерді өңдеу codeынан бөлуге мүмкіндік береді, сонымен қатар бізге өкілеттік беру мүмкіндігін береді. throws көмегімен codeты пайдаланушыға ерекше жағдайды өңдеу.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION