JavaRush /Java Blog /Random-TK /Java-da kadadan çykmalar
Roman
Dereje

Java-da kadadan çykmalar

Toparda çap edildi
“Kadadan çykmalar” mowzugyna duşanymda, köp işleýändigi barada jikme-jik düşünmek üçin internetiň dürli burçlaryndan jogap gözlemeli boldum. Netijede, bu hadysany ýaňy başdan geçirenler üçin has düşnükli bolup biljek öz düşündirişimi düzdüm. Java-da kadadan çykmalar - 1Kompýuterlerde bökdençlik , gyssagly jogap berilmegini talap edýän hadysanyň bolup geçýändigi prosessor üçin gelýän signaldyr. Arakesme signaly prosessordan biraz soň dowam etdirilmegi üçin işleýän programmany duruzmagyny talap edýär, ýagny kompýuter programmanyň ýerine ýetirilmegi bilen baglanyşykly ähli maglumatlary ýatda saklamalydyr. Şeýle bökdençlikler ölümli bolmasa wagtlaýyn. Şeýle bökdençlikler programma kody ýa-da käbir enjam işleýşi sebäpli bolup biler (mysal üçin, klawiaturadaky düwmeleri basmak; taýmerler, meselem, kompýuteriň awtomatiki öçürilmegi). Arakesmeleriň sany belli bir prosessoryň önümçiliginde gurlan belli bir san bilen çäklenýär, ýagny munuň üçin ýörite aragatnaşyk “kanallary” bölünip, prosessora beýleki ähli amallardan aýlanyp geçmäge mümkinçilik berýär. Şeýle hem ýerine ýetiriş programma kodynda ýalňyşlyk ýüze çykanda (meselem, nula bölmek ýüze çyksa) arakesmeler awtomatiki usulda döredilýär. Şeýle bökdençliklere adatça duzak ýa-da kadadan çykma diýilýär . Şeýle ýagdaýlarda: “Kadadan çykma atyldy” diýmek, adatça, kadadan çykma ýüze çykdy ýa-da kadadan çykma zyňyldy (zyňyldy), ýagny kesmek haýyşy“näme etmeli?” diýen sorag bilen. prosessoryna iberildi. Bu pursatda, prosessor nirede durandygyny, has dogrusy ýerine ýetirilmeli maglumatlary indiki öýjügiň toparyny ýada salmak bilen işlemegini bes edýär. Executederine ýetirilen we ýerine ýetirilmedik görkezmeleriň tutuş zynjyry ýatda saklanýar. Ondan soň, prosessor şeýle ýalňyşlyk ýüze çykan halatynda hereket etmek üçin ýadyň görkezmelerini okaýar. Bu görkezmä laýyklykda, belli bir toparlara täze bahalary girizip biler, käbir hereketler zynjyryny ýa-da täze aýlawy (mysal üçin, gaýdyp gelmek ýa-da aýlaw sikli) we ş.m. goşup biler, ýagny öň goýlan ýalňyşlyga baglylykda. aşak görkezmeler ýerine ýetirilýär. Kompýuter ulgamynyň özünde belli bir wagtdan soň ýüze çykýan köp sanly awtomatiki arakesmeler bar, meselem, kompýuterde işleýän proseslere gözegçilik etmek ýa-da duýduryşlary işletmek, gelýän daşarky signallary we dürli maglumat öwrüjileri. Köp sanly arakesmeleriň, birnäçe sebäplere görä ulgamy düýbünden “asyp” biljekdigini ýatdan çykarmaly däldiris. Programma kodyndaky ýalňyşlyk, bellenilen görkezmelere laýyklykda işlemäge synanyşjak prosessoryň awtomatiki kesilmegine sebäp bolar. Allöne arakesmeleriň hemmesi olary çözmek üçin döredilenok ýa-da bize laýyk gelmeýän prosedura döredip biler, mysal üçin, programmany ýykar. Şonuň üçin programmirlemekde programmistiň ýalňyşlyk ähtimallygyny görýän koduň belli bir bölümi üçin öz arakesmäňizi tertipläp bolýar. Bu ýagdaýda ýalňyşlyk programmanyň içinde işlener we görkezmeleri gaýtadan işlemek üçin prosessor bilen habarlaşmaz. Şeýle bloklaryň kesgitlemesi “Kadadan çykma” obýektini döretmek arkaly gurnalýar . Bu obýekt awtomatiki usulda blokda döredilýär try-catch. Blokda >trysäwligiň barlygy barlanýar we bir ýalňyşlyk bar bolsa, programma blokirleme gidýär catch, bu ýerde ýalňyşlygyň öňüni almak ýa-da tekizlemek üçin çäreler görülýär. Mysal üçin, klawiaturadan Sanlary girizsek , soňundan goşulmaly we aýrylmaly bolsa, klawiaturadan Hatlary girizmek, olary Sanlar bilen goşmak mümkin bolmaz (geliň, bu iki üýtgeýjiniň jemini S harpy bilen görkezeliň). Şonuň üçin topar hökmünde trySanlary öz içine alýan A belginiň, harplary (ýagny S = A + B) öz içine alýan B belgisine goşup boljakdygyny ýa-da ýokdugyny barlamaly, eger bu mümkin däl bolsa we mümkin däl bolsa, onda belli roralňyşlyklar bolup geçmezligi üçin çäreler görülmelidir we “näme etmeli?” diýen sorag bilen täze Aragatnaşyk prosessoryň ýanyna uçmaz. Programmada kadadan çykma ýok bolsa, prosessor tarapyndan ýerine ýetirilmegi kesiler. Kadadan çykma bar bolsa, buýruk "tutulanda" try, alternatiw çözgüt kesgitläp bilýän buýruga geçýär catch, mysal üçin, bu iki san goşmarys, ýöne S = A. goýarys.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/ * setir “int r = 1;” ýalňyşlyk ýüze çykanlygy sebäpli ýerine ýetirilmeýär we programma gönüden-göni kadadan çykaryjylara ugrukdyrýar (tutmak bloky * / Şeýlelik bilen, Kadadan çykmalaryň bolmagy programmanyň içindäki meseläni prosessor derejesine atmazdan çözmäge mümkinçilikdir. Erroralňyşlyk ýüze çykanda blokda awtomatiki usulda döredilen “Kadadan çykma” obýekti trysäwlik görnüşiniň bahasyny öz içine alýar. Geliň, “OurException” diýeliň - aýratyn ýalňyşlygymyzy düşündirýän aýratyn ýagdaýymyz üçin. Java dilini döredijiler adaty ýalňyşlyklaryň belli bir sanawyny we olary düzetmek üçin adaty wariantlary öňünden döretdiler, ýagny java-da belli bir kadadan çykmalar kitaphanasy bar , ýüze çykan ýalňyşlygy çözmek üçin ýüz tutup bileris. gaýtadan işlemek koduny özümiz ýazmaly däldiris we şonuň üçin “OurException” -da eýýäm kimdir biri beýan edilen bolsa gerek, şonuň üçin şowsuzlygyň bolup biläýjek kody dolandyrmak üçin programmamyza haýsy kadadan çykmalaryň adyny bilmeli. Aalňyşlyk goýbersek we kitaphanadan nädogry kadadan çykma saýlasak , işleýän adam ony “tutmaz”, ýalňyşlyk programmanyň içinde çözgüt tapmaz we haýyş prosessora iberiler. Emma ýaltalar üçin bir ýol bar. Kitaphanadan zerur kadadan çykma adyny bilmeýän bolsak, ýokarda görkezilen mysalda bolşy ýaly, umumy kadany “ Kadadan çykma ” ady bilen alyp bileris. Bu kadadan çykma islendik ýalňyşlygy çözmäge ukyply, ýöne hasaba alyp boljak waka barada anyk maglumat bermäge ukyply däl. Öň ýazylan kadadan çykmalar kitaphanasy barlanylan we barlanmadyk kadadan çykmalardan ybarat . Barlap boljaklar , programmanyň işine päsgel bermezden düzedip boljaklar, ýagny faýly ýok bukjada açjak bolsak, ulgam bize bu barada habar berer, faýly taşlap bileris islenýän bukjanyň içine giriň we programmany dowam etdiriň. Actagny, aslynda, Aragatnaşyk kesmek haýyşy prosessora iberildi , ýöne soragsyz: "Bu mesele barada näme etmelidigini gözläň?!?!" Prosessoryň programmany gaýtadan işleýän we ýerine ýetirmegini dowam etdirýän taýýar görkezme bilen özümiz kesgitlän Arakesme iberdik. Barlanmadyk düzedişler düzedip bolmaýan ýalňyşlyklar bar we programma tamamlanmanka ýapylar, ýagny prosessora Arakesme haýyşy iberiler., islendik ýagdaýda programmanyň ýerine ýetirilmegine päsgel berer. Programmada şeýle kadadan çykmalary ýazmagyň ýeke-täk nokady, ulanyja bolup geçen zatlara düşünmekdir, sebäbi bu bökdençligi başdan geçirip, ekranda maglumat habaryny görkezip bileris, şonuň üçin programma ýykyldy. Şeýle bökdençlikleri tutmagyň ikinji sebäbi, indiki derňew üçin olary surnallara ýazmak ukybydyr (haker edildi, ýöne iň bolmanda nirededigini bilýärsiňiz). Şeýle kitaphanalaryň barlygynyň netijesi, olary goşmagy ýatdan çykarmaly däldir. (Kitaphanalar bilen barlanan we barlanmadyk kadadan çykmalar sanawyny tapyp bilersiňiz, mysal üçin şu ýerde ) Haýsy kitaphanany goşmalydygyny ýa-da birnäçe ýalňyşlyk wariantynyň bardygyny bilmesek, catchzerur kadadan çykmalary sanap bileris. Ulgam sanawda bolsa, dogry işleýjini saýlar. Belli bir kadadan çykma ýerine , öňki bloklarda işlenmedik bolsa, islendik kadadan çykma görnüşini dolandyryp biljek umumy “ Kadadan çykma ” ýazyp bilersiňiz .
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;
Blok bar bolsa, trykadadan çykma awtomatiki usulda döredilýär. Belli bir wagtda kadadan çykma mejbur etmeli bolsa , buýruk ulanylýar throw. Independentagny, özbaşdak bir obýekt döredýäris new throw... şondan soň programma işini togtadýar, prosessora Arakesmecatch haýyşyny iberýär we mundan beýläkki hereketler üçin görkezmeler almaga synanyşýan programma bölümine geçirilýär . Kadadan çykma bilen el bilen döredip , onuň aýratyn görnüşini kitaphanadan kesgitläp bileris:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
soň işleýji catchbu aýratyn kadadan çykma bilen bir blok gözlär - programmanyň hemme tarapynda gözläň catch. Kadadan çykma buýrugyndan soň throw, blokdaky zatlardan başga ähli galan programma kody ýerine ýetirilmez catch. Eger programmada işleýji tapylmasa, prosessora “näme etmelidigiňizi özüňiz kesgitläň” diýen sorag berilýär we bu programma kesilýär. Çagyryş ... blokyň new throwiçinde we daşynda edilip bilner (programmanyň islendik ýerinde)>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 другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Kadadan çykmalar barada duýduryş

Öň kimdir biri tarapyndan ýazylan usullar kadadan çykmalary öz içine alyp biler. Diňe ygtybarly tarapda bolmak üçin kod ýazan programmist, indiki programmistlere ýazan usulynda ýalňyşlyk bolup biljekdigini duýdurdy. Mysal üçin, aşakda beýan edilen faýl döretmek usuly faýl döredilende ýalňyşlyk ýüze çykyp biljekdigini (berlen ýolda faýl ýok) göz öňünde tutýar, bu bolsa ýalňyş işleýjiniň zerur boljakdygyny aňladýar:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Theöne şol bir wagtyň özünde işleýjiniň özi ýok, bu indi programmamyzda ýazylan usuly adaty tertipde çagyryp bilmejekdigimizi aňladýar. Indi ýalňyşlyk işleýjisini ýazmaly we bu usuly blokda çagyrmaly try:
String filePath = "hello.txt";
String text = "Hello World";

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

Ativeerli kadadan çykmalar

Bar bolan kitaphanalar bize ýeterlik bolmasa, käbir ýalňyşlyklary çözmek üçin öz kadadan çykmalaryňyzy ýazyp bilersiňiz. Munuň üçin diňe “Expression” synpyndan miras galan synp döredýäris
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Öz kadadan çykmalaryňyzy döredeniňizde ýatda saklamaly iki düzgün bar:
  1. Synpymyzyň ady "Kadadan çykma" bilen gutarmaly
  2. Synpda kadadan çykma meselesiniň jikme-jikliklerini suratlandyrýan üýtgeýän üýtgeýän konstruktor bolmaly. Konstruktorda super konstruktor çagyrylýar we habar iberilýär.
Döredilen kadadan çykmany ulanmagyň mysaly:
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);
        }
    }
}
Bu kadadan çykma kody bilen alýarys:
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);
        }
    }
}
Programmany ýerine ýetirmegiň netijesi: StudentNotFoundException: ID 0000001 bolan okuwçyny tapyp bilmedim

Kadadan çykmalar näme üçin ýazmaly?

1996-njy ýylda ýüzýän üýtgeýjiniň bitewi üýtgeýjä nädogry öwrülmegi sebäpli “Ariane 5” raketasy heläkçilige uçrady. Bu ýagdaý üçin kadadan çykmalar ýa-da işleýänler ýokdy. Faýl göçürip alanyňyzda internete birikme ýitirilen bolsa, kadadan çykma bolmagy birikme dikeldilenden soň göçürip almaga dowam eder. Kadadan çykma ýok bolsa, göçürip almak täzeden başlamaly bolar.

Salgylar:

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION