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: ähli kadadan çykmalar umumy ata-babalar synpyna eýeThrowable
. 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 ). Barlanan 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:
ArithmeticException
nula bölünende ýüze çykýarArrayIndexOutOfBoundsException
Toplumyň daşyndaky öýjüge girjek bolanda ýüze çykýar.
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örkezmeliException
. 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 Exception
bir ç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 DogIsNotReadyException
we 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-catch
Kadadan ç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 :)
GO TO FULL VERSION