JavaRush /Java блогы /Random-KK /Java тіліндегі ерекшеліктер
Roman
Деңгей

Java тіліндегі ерекшеліктер

Топта жарияланған
Мен «Ерекшеліктер» тақырыбына тап болған кезде, оның қалай жұмыс істейтінін егжей-тегжейлі түсіну үшін Интернеттің әртүрлі бұрыштарынан жауап іздеуге тура келетін көптеген сұрақтар туындады. Нәтижесінде мен өзімнің түсіндірмені құрастырдым, бұл жаңадан осы құбылысқа тап болған жаңадан бастағандар үшін түсінікті болуы мүмкін. Java тіліндегі ерекшеліктер - 1Компьютерлерде үзіліс – бұл дереу жауап беруді қажет ететін оқиғаның орын алуы туралы процессорға келетін кіріс сигналы. Үзіліс сигналы процессордан жұмыс істеп тұрған бағдарламаны сәл кейінірек жалғастыру үшін кідіртуді талап етеді, яғни компьютер программаның орындалуымен байланысты барлық ақпаратты есте сақтауы керек. Мұндай үзілістер өліммен аяқталмаса, уақытша болып табылады. Мұндай үзілістер не бағдарлама codeымен, не аппараттық құралдың кейбір функцияларымен (мысалы, пернетақтадағы пернелерді жай басу; таймерлер, мысалы, компьютерді автоматты түрде өшіру) себеп болуы мүмкін. Үзілістер саны белгілі бір процессордың өндірісіне енгізілген белгілі бір санмен шектелген, яғни бұл үшін барлық басқа процестерді айналып өтіп процессорға қол жеткізуге мүмкіндік беретін арнайы байланыс «арналары» бөлінген. Орындаушы программа codeында қате орын алған кезде де үзілістер автоматты түрде жасалады (мысалы, нөлге бөлу орын алса). Мұндай үзілістер дәстүрлі түрде тұзақ немесе ерекше жағдайлар деп аталады . Мұндай жағдайларда: «Ерекшелік тасталды» деп айту әдеттегідей, яғни Ерекшелік іске қосылды немесе Ерекшелік тасталды (лақтырылды), яғни үзіліс туралы сұрау.«Не істеу керек?» Деген сұрақпен процессорға жіберіледі. Осы сәтте процессор жұмысын тоқтатады, ол тоқтаған нүктені, дәлірек айтсақ келесі ұяшықтың кластерін есте сақтайды, одан ақпарат орындалуы керек. Орындалған және орындалмаған нұсқаулардың бүкіл тізбегі есте сақталады. Осыдан кейін процессор мұндай қате болған жағдайда әрекет ету үшін жадтан нұсқауларды оқиды. Осы нұсқаулыққа сәйкес, ол белгілі бір кластерлерге жаңа мәндерді енгізе алады, кейбір әрекеттер тізбегін немесе жаңа циклды (мысалы, қайтару немесе циклдік цикл) және т.б., яғни бұрын қойылған қатеге байланысты қоса алады. төмен нұсқаулар орындалады. Компьютерлік жүйенің өзінде оған орнатылған көптеген автоматты үзілістер бар, олар белгілі бір уақыттан кейін іске қосылады, мысалы, компьютерде орындалатын процестерді басқару немесе орнатылған дабылдарды іске қосу, кіріс сыртқы сигналдарды жинау және әртүрлі деректерді түрлендіргіштер. Бірнеше себептерге байланысты үзілістердің үлкен саны жүйені толығымен «іліп қоюы» мүмкін екенін есте ұстаған жөн. Бағдарлама codeындағы қате процессорда автоматты түрде үзіліс тудырады, ол белгіленген нұсқауларға сәйкес өңдеуге тырысады. Бірақ барлық үзілістер оларды өңдеуге арналмаған немесе ол бізге сәйкес келмейтін proceduresаны тудыруы мүмкін, мысалы, ол жай ғана қолданбаны бұзады. Сондықтан, бағдарламалауда бағдарламашы қате мүмкіндігін көретін codeтың белгілі бір бөлімі үшін өзіңіздің үзуіңізді ұйымдастыруға болады. Бұл жағдайда қате бағдарлама ішінде өңделеді және нұсқауларды өңдеу үшін процессорға хабарласпайды. Мұндай блоктардың анықтамасы «Ерекше» нысанын жасау арқылы ұйымдастырылады . Бұл нысан блокта автоматты түрде жасалады try-catch. Блок >tryқатенің бар-жоғы үшін тексеріледі және егер бар болса, бағдарлама блокқа өтеді catch, онда қатені болдырмау немесе түзету үшін әрекеттер жасалады. Мысалы, егер біз пернетақтадан Сандарды енгізсек , оны кейіннен қосу және алу керек, онда пернетақтадан әріптерді енгізу оларды Сандармен қосу мүмкін емес болады (осы екі айнымалының қосындысын S әрпімен белгілейік). Сондықтан, біз команда ретінде tryәріптері бар В санына (яғни, S = A + B) құрамында Сандар бар А санын қосуға болатындығын тексеруіміз керек, ал егер бұл мүмкін болмаса және мүмкін болмаса, онда белгілі Қателер Болмады және «не істеу керек?» Деген жаңа үзіліс процессорға ұшып кетпеуі үшін шаралар қабылдау керек. Бағдарламада Exception болмаса, оның орындалуы процессормен үзіледі. Егер Ерекшелік болса, ол пәрмен арқылы «ұсталса» try, басқару балама шешімді орнатуға болатын пәрменге өтеді catch, мысалы, біз бұл екі санды қоспаймыз, бірақ S = A орнатамыз.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* жолы “int r = 1;” орындалмайды, себебі қате орын алды және бағдарлама жұмысты тікелей ерекшелік өңдеушіге бағыттайды (catch block*/ Осылайша, Ерекшеліктердің болуы бағдарламаның ішінде мәселені процессор деңгейіне тастамай шешу мүмкіндігі болып табылады. Қате анықталған кезде блокта автоматты түрде жасалатын «Ерекшелік» an objectі tryқате түрінің мәнін қамтиды. Оны «Біздің Ерекшелік» деп атаймыз - біздің нақты қатемізді сипаттайтын нақты жағдай үшін. Java тілін жасаушылар алдын ала типтік қателердің белгілі бір тізімін және оларды түзетудің типтік нұсқаларын жасады, яғни java-да белгілі бір Ерекшеліктер кітапханасы бар , біз оған орын алған қатені өңдеу үшін жүгіне аламыз, осылайша өңдеу codeын өзіміз жазбауымыз керек, сондықтан OurException әлдеқашан сипатталған болуы мүмкін, сондықтан қате орын алуы мүмкін codeты өңдеу үшін бағдарламамызға осы ерекшеліктердің қайсысын енгізу керектігін білуіміз керек. Егер біз қате жіберіп, кітапханадан қате Ерекшелікті таңдасақ , өңдеуші оны «ұстамайды», қате бағдарлама ішінде шешім таба алмайды және сұраныс процессорға жіберіледі. Бірақ жалқаулардың жолы бар. Кітапханадан бізге қажет ерекше жағдайдың атын білмесек, жоғарыда сипатталған мысалдағыдай « Ерекшелік » деген атаумен жалпысын алуға болады. Бұл Ерекшелік қатенің кез келген түрін өңдеуге қабілетті, бірақ ол біз тіркеуге болатын оқиға туралы нақты ақпаратты бере алмайды. Бұрын жазылған Ерекшеліктер кітапханасы тексерілген және белгіленбеген Ерекшеліктерден тұрады . Тексерілетіндер - бұл бағдарламаның жұмысын тоқтатпай түзетуге болатындар, яғни файлды ол жоқ қалтада ашуға тырыссақ, жүйе бұл туралы бізге хабарлайды, біз файлды тастай аламыз. қалаған қалтаға салып, бағдарламаны жалғастырыңыз. Яғни, іс жүзінде процессорға үзіліс туралы сұрау жіберілді , бірақ сұрақсыз: «бұл мәселе бойынша не істеу керектігін іздеңіз?!?!» Біз өзіміз анықтаған үзілісті дайын нұсқаумен жібердік, оны процессор өңдеп, бағдарламаны орындауды жалғастырды. Түзетуге болмайтын және бағдарлама аяқталмай тұрып жабылатын қателер белгіленбеген, яғни процессорға үзу сұрауы жіберіледі., ол кез келген жағдайда бағдарламаның орындалуын тоқтатады. Бағдарламада мұндай ерекшеліктерді жазудың жалғыз нүктесі - пайдаланушыға не болғанын түсінуге мүмкіндік беру, өйткені бұл үзілісті байқағаннан кейін біз экранда бағдарламаның бұзылуына байланысты ақпараттық хабарламаны көрсете аламыз. Мұндай үзілістерді ұстаудың екінші себебі - оларды кейінгі талдау үшін журналдарға жазу мүмкіндігі (сіз бұзылғансыз, бірақ кем дегенде қай жерде екенін білесіз). Мұндай кітапханалардың болуының салдары оларды қосуды есте сақтау қажеттілігі болып табылады. (Кітапханалары бар тексерілген және белгіленбеген Ерекшеліктердің тізімін, мысалы, мына жерден табуға болады ) Егер біз нақты қай кітапхананы қосу керектігін білмесек немесе бірнеше қате опциялары болса, онда біз catchқажетті Ерекшеліктерді бірнеше тізімге енгізе аламыз. Жүйенің өзі тізімде болса, дұрыс өңдегішті таңдайды. Арнайы Ерекшеліктің орнына , егер ол алдыңғы блоктарда өңделмеген болса, Ерекшеліктің кез келген түрін өңдей алатын жалпы « Ерекшелік » жаза аласыз .
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Егер блок болса, tryЕрекшелік автоматты түрде жасалады. Егер белгілі бір уақытта Ерекшелікті мәжбүрлеу қажет болса , онда пәрмен қолданылады throw. Яғни, біз an objectіні өз бетінше жасаймыз new throw... содан кейін бағдарлама жұмысын тоқтатады, процессорға үзіліс сұрауын жібереді және бағдарлама бөліміне ауыстырылады catch, ол жерден келесі әрекеттер үшін нұсқауларды алуға тырысады. Ерекше жағдайды қолмен жасау арқылы біз оның арнайы түрін кітапханадан көрсете аламыз:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
catchсодан кейін өңдеуші осы ерекше Ерекшелігі бар блокты іздейді - бағдарлама бойынша барлық жағынан іздеу catch. Ерекше жағдайды өңдеу пәрменінен кейін throwблоктағы codeтан басқа барлық қалған бағдарлама codeы ОРЫНДАЛМАЙДЫ catch. Бағдарламада өңдеуші табылмаса, процессорға сұрақ қойылады: «не істеу керектігін өзіңіз шешіңіз» және ол бағдарламаны тоқтатады. Қоңырау ... блоктың new throwішінде де, сыртында да жасалуы мүмкін (бағдарламаның кез келген жерінде)>try
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Ерекшеліктер туралы хабарлама

Бұрын біреу жазған әдістер Ерекшеліктерді шығаруды қамтуы мүмкін. Қауіпсіз болу үшін codeты жазған бағдарламашы кейінгі бағдарламашыларға ол жазған әдісте қате болуы мүмкін екенін ескертті. Мәселен, мысалы, төменде сипатталған файлды жасау әдісі файлды жасау кезінде қате пайда болуы мүмкін екенін (берілген жолда файл жоқ) қарастырады, яғни қате өңдегіш қажет болады:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Бірақ сонымен бірге өңдеушінің өзі жоқ, яғни енді біз қалыпты режимде бағдарламамыздағы жазылған әдісті жай шақыра алмаймыз. Енді біз қате өңдегішін жазып, блокта осы әдісті шақыруымыз керек try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Жергілікті ерекшеліктер

Егер бар кітапханалар бізге жеткіліксіз болса, белгілі бір қателерді өңдеу үшін өзіңіздің ерекше жағдайларыңызды жазуға болады. Ол үшін біз жай ғана Exception сыныбынан мұрагер болатын класс жасаймыз
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Өзіңіздің ерекше жағдайларыңызды жасау кезінде есте сақтау керек екі ереже бар:
  1. Біздің сыныптың аты "Ерекше" деп аяқталуы керек
  2. Класста Ерекшелік мәселесінің мәліметтерін сипаттайтын жол айнымалысы бар конструктор болуы керек. Конструкторда супер конструктор шақырылады және хабарлама жіберіледі.
Жасалған ерекше жағдайды пайдалану мысалы:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Біз бұл Ерекшелікті codeпен ұстаймыз:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Бағдарламаны орындау нәтижесі: StudentNotFoundException: ID 0000001 студентті табу мүмкін емес.

Неліктен ерекше жағдайларды жазу керек?

1996 жылы Ariane 5 зымыраны қалқымалы айнымалыны бүтін айнымалыға дұрыс түрлендіру салдарынан апатқа ұшырады. Бұл жағдай үшін ерекшеліктер немесе өңдеушілер болған жоқ. Файлды жүктеп алу кезінде Интернетке қосылу жоғалса, Ерекшеліктің болуы қосылым қалпына келтірілгеннен кейін жүктеуді жалғастыруға мүмкіндік береді. Ерекшелік болмаса, жүктеуді қайта бастау керек болады.

Қолданылған әдебиет:

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION