JavaRush /Java Blog /Random-TK /Kadadan çykmalar: barlanyldy, barlanmady we özüňiz

Kadadan çykmalar: barlanyldy, barlanmady we özüňiz

Toparda çap edildi
Salam! Iň soňky leksiýada Java diliniň kadadan çykmalar ýaly tarapy bilen tanyşdyk we olar bilen işlemegiň mysallaryny gördük. Bu gün olaryň gurluşyna has içgin serederis, şeýle hem öz kadadan çykmalarymyzy ýazmagy öwreneris :)

Kadadan çykmagyň görnüşleri

Aýdyşymyz ýaly, Java-da 400-den gowrak kadadan çykma sapaklary bar! Emma olaryň hemmesi toparlara bölünýär, şonuň üçin olary ýatda saklamak aňsat. Görnüşi ýaly: Kadadan çykmalar: barlanyldy, barlanmady we özüňiz - 2ähli kadadan çykmalar umumy ata-babalar synpyna eýe Throwable. Ondan iki sany uly topar gelýär - kadadan çykmalar (Kadadan çykma) we ýalňyşlyklar (roralňyşlyk). Java wirtual maşynyň işleýşi bilen baglanyşykly programma ýerine ýetirilende säwlik möhüm ýalňyşlykdyr. Köplenç säwligi düzetmegiň zerurlygy ýok, sebäbi koddaky käbir çynlakaý kemçilikleri görkezýär. Iň meşhur ýalňyşlyklar: StackOverflowError- meselem, bir usul tükeniksiz özüni çagyranda we OutOfMemoryError- täze obýektleri döretmek üçin ýadyň ýeterlik bolmazlygynda ýüze çykýar. Görşüňiz ýaly, bu ýagdaýlarda köplenç işlemek üçin aýratyn zat ýok - kod diňe nädogry ýazylýar we täzeden işlenmeli. Kadadan çykmalar , aslynda kadadan çykmalar: programma işleýän wagtynda ýüze çykan adatdan daşary, meýilleşdirilmedik ýagdaý. Bular säwlik ýaly çynlakaý ýalňyşlyklar däl, ýöne olar biziň ünsümizi talap edýär. Exhli kadadan çykmalar 2 görnüşe bölünýär - barlanýar ( barlanýar ) we barlanmadyk ( barlanmadyk ). Kadadan çykmalar: barlanyldy, barlanmady we özüňiz - 3Barlanan kadadan çykmalar Exception. “Barlap bolýan” diýmek näme? Soňky leksiýada bu barada bölekleýin aýdypdyk : “... Java düzüjisi iň köp ýaýran kadadan çykmalary bilýär we haýsy ýagdaýlarda bolup biljekdigini bilýär.” Mysal üçin, programmist bir faýldan maglumatlary kodda okasa, faýlyň ýoklugyna aňsatlyk bilen ýüze çykyp biljekdigini bilýär. Öňünden aýdyp biljek şeýle ýagdaýlar kän. Şonuň üçin düzüji potensial kadadan çykmalar üçin kodumyzy öňünden barlaýar. Olary tapsa, kodlary gaýtadan işleýänçäk ýa-da ýokarsyna iberýänçäk kod düzmez. Ikinji kadadan çykma görnüşi "barlanmady". Olar synpdan gelýärler RuntimeException. Synagdan nädip tapawutlanýar? RuntimeExceptionŞeýle hem, iş wagtynyň kadadan çykmalaryny beýan edýän we dürli synplaryň bir topary bar ýaly . Tapawut, düzüjiniň bu ýalňyşlyklara garaşmaýandygy. Ol: “Kod ýazan wagtym şübheli zat tapmadym, ýöne işleýän wagty bir zat ýalňyşdy. Kodda ýalňyşlyklar bar bolsa gerek! " Hakykatdanam şeýle. Barlanmadyk kadadan çykmalar köplenç programmist ýalňyşlyklarynyň netijesidir. Düzediji, adamlaryň öz eli bilen döredip biläýjek ähli nädogry ýagdaýlary üpjün edip bilmejekdigi aýdyňdyr :) Şonuň üçin kodumyzdaky şeýle kadadan çykmalar barlanmaz. Barlanylmadyk birnäçe kadadan çykma bilen ýüzbe-ýüz bolduňyz:
  • ArithmeticExceptionnula bölünende ýüze çykýar
  • ArrayIndexOutOfBoundsExceptionToplumyň daşyndaky öýjüge girjek bolanda ýüze çykýar.
Teoretiki taýdan, elbetde, Java döredijiler şeýle kadadan çykmalary hökmany suratda girizip bilerdiler, ýöne kod näme bolardy? Sanlary bölmek boýunça islendik amal bilen, tötänleýin nula bölýändigiňizi barlamak üçin synanyşyk ýazmaly bolarsyňyz? Haçan-da bir massiw gireniňizde, bu çäklerden geçendigiňizi barlamak üçin synanyşyk ýazmaly bolarsyňyz. Writtenazylan islendik kod spagetti we düýbünden okalmaz. Bu pikiriň terk edilendigi mantykly. Şonuň üçin barlanmadyk kadadan çykmalar synanyşyk bloklarynda işlenmeli ýa-da ýokarsyna zyňylmaly däl, bu Error ýaly tehniki taýdan mümkin bolsa-da.

Kadadan çykmany nädip taşlamaly

Elbetde, “Java” döredijileri programmalarda ýüze çykyp biljek ähli aýratyn ýagdaýlary üpjün edip bilmeýärler. Dünýäde gaty köp programma bar we olar gaty üýtgeşik. That'söne bu gowy, sebäbi zerur bolsa öz kadadan çykmalaryňyzy döredip bilersiňiz. Bu gaty aňsat edilýär. Bar etmeli zadyňyz, öz synpyňyzy döretmekdir. Onuň ady “Kadadan çykma” bilen gutarmaly. Düzüjiniň muňa zerurlygy ýok, ýöne koduňyzy okaýan programmistler munuň kadadan çykma synpydygyna derrew düşünerler. Mundan başga-da, synpyň synpdan gelýändigini görkezmeli Exception. Bu düzüji we dogry işlemek üçin eýýäm zerurdyr. Mysal üçin, bizde It synpy bar - Dog. Iti ulanyp bileris walk(). Thatöne ondan ozal öý haýwanymyzyň ýakasy, dyrnagy we agzynyň bardygyny ýa-da ýokdugyny barlamaly. Bularyň haýsydyr biri ýitirim bolsa, öz kadamyzy taşlarys DogIsNotReadyException. Kody şeýle bolar:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Synpyň kadadan çykmaýandygyny görkezmek üçin, synpyň adyndan soň kadadan çykma ýazmaly : bu "synpyň synpdan çykýandygyny" aňladýar. Konstruktorda synp konstruktoryna diňe Exceptionbir çyzyk bilen jaň ederis message- bu ulanyja ýüze çykan ýalňyşlygy suratlandyrýan ulgamdan habary görkezer. Bu biziň synp kodumyzda nähili bolar:
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
Indi biziň usulymyz walk()kadadan çykma edýär DogIsNotReadyException. Bu açar söz bilen edilýär throw. Öň hem aýdyşymyz ýaly, kadadan çykma obýektdir. Şol sebäpden, usulymyzda, adatdan daşary ýagdaý ýüze çykanda - itde bir zat ýok bolsa - täze synp obýektini döredýäris DogIsNotReadyExceptionwe söz ulanyp programma atýarys throw. Usul goluna walk()zyňýarys DogIsNotReadyException. Başga sözler bilen aýdylanda, düzüji usul jaňynyň walk()kadadan çykma bolup biljekdigine indi düşünýär. Şonuň üçin programmanyň bir ýerinde muny çagyranymyzda, kadadan çykma çözülmeli. Usulda muny etmäge synanyşalyň main():
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Düzmeýär, kadadan çykma ýok! try-catchKadadan çykmak üçin kodumyzy blok bilen örteliň :
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
Indi konsolyň çykyşyna seredeliň:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Konsol çykyşynyň has manyly bolandygyna serediň! Programmada bolup geçen her bir ädimi görýäris; Thealňyşlygyň nirede ýüze çykandygyny görýäris we itimiziň nämäni ýitirendigini derrew görýäris :) Ine, öz kadadan çykmalarymyzy şeýle döredýäris. Görşüňiz ýaly çylşyrymly zat ýok. Java döredijiler nädogry enjamlaşdyrylan itler üçin öz diline aýratyn kadadan çykma goşmakdan çekinmeseler-de, biz olaryň gözegçiligini düzedik :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION