CodeGym /Java blog /Véletlen /Kivételek: bejelölt, nem bejelölt és egyéni
John Squirrels
Szint
San Francisco

Kivételek: bejelölt, nem bejelölt és egyéni

Megjelent a csoportban
Szia! Az utolsó órán megismerkedtünk a Java nyelv kivételeivel, és példákat láttunk az ezekkel való munkavégzésre. Ma mélyebben áttekintjük a kivételek szerkezetét, és megtanuljuk, hogyan írjuk le a saját kivételeinket :)

A kivételek típusai

Ahogy korábban mondtuk, sok kivétel van a Java-ban, közel 400! De mindegyik csoportra van osztva, így meglehetősen könnyű megjegyezni őket. Így néz ki: Kivételek: bejelölt, nem bejelölt és egyéni - 2 Minden kivételnek van egy közös őse az osztályban Throwable. Két nagy csoport származik belőle: kivételek ( Exception ) és hibák ( Error ). Hiba – Ez a Java virtuális gép működésével kapcsolatos kritikus futásidejű hiba. A legtöbb esetben az Error-t nem kell kezelni, mivel komoly hibákat jelez a kódban. Ezek közül a leghíresebb a StackOverflowError (ez akkor fordul elő, ha egy metódus végtelenül hívja magát) és az OutOfMemoryError(ez akkor fordul elő, ha nincs elég memória új objektumok létrehozásához). Mint látható, ezekben a helyzetekben általában nincs mit kezelni futás közben: a kód egyszerűen rosszul van megírva, és át kell dolgozni. Kivétel – Nos, ez kivételt jelent: egy kivételes, nem tervezett helyzet, amely a program futása közben következik be. Nem olyan súlyosak, mint az Error, de mégis megkövetelik a figyelmünket. Minden kivétel két típusra oszlik: bejelölt és nem bejelölt . Kivételek: bejelölt, nem bejelölt és egyéni - 3 Minden ellenőrzött kivétel az osztályból származik Exception. Mit jelent a "ellenőrzött"? Erre utaltunk a legutóbbi leckében: "A Java fordító tehát ismeri a leggyakoribb kivételeket és azokat a helyzeteket, ahol ezek előfordulhatnak." Például tudja, hogy ha a kód adatokat olvas ki egy fájlból, könnyen előfordulhat, hogy a fájl nem létezik. És nagyon sok ilyen helyzet van (amiből következtethet). Ennek megfelelően a fordítóprogram előzetesen ellenőrzi a kódunkat, hogy vannak-e ezek a lehetséges kivételek. Ha megtalálja őket, addig nem fordítja le a kódot, amíg nem kezeljük vagy újra nem dobjuk őket. A második típusú kivétel a „bejelöletlen”. Az osztályból származnak RuntimeException. Miben különböznek az ellenőrzött kivételektől? Úgy tűnik, hogy sok különböző osztályból származnakRuntimeException(amelyek a futásidejű kivételeket írják le). A különbség az, hogy a fordító nem látja előre ezeket a hibákat. Úgy tűnik, hogy ezt mondja: "A kód írásakor nem találtam semmi gyanúsat, de valami hiba történt futás közben. Úgy tűnik, hibák vannak a kódban!" És ez valóban igaz. A nem ellenőrzött kivételek leggyakrabban programozói hibák következményei. A fordító pedig nyilvánvalóan nem tud előre látni minden lehetséges rossz helyzetet, amelyet az emberek saját kezűleg létrehozhatnak. :) Ezért nem ellenőrzi, hogy a kódunkban kezelve vannak-e az ilyen kivételek. Már találkozott több ellenőrizetlen kivétellel:
  • Aritmetikai kivétel akkor fordul elő, ha nullával osztunk
  • ArrayIndexOutOfBoundsException akkor fordul elő, amikor a tömbön kívüli pozícióhoz próbál hozzáférni.
Persze elképzelhető, hogy a Java készítői bevezethettek volna kötelező kivételkezelést, de ebben az esetben a kód túl bonyolult lenne. Bármilyen osztási művelethez írnod ​​kell egy try-catchblokkot, hogy ellenőrizd, nem osztottál-e véletlenül nullával? Minden alkalommal, amikor hozzáfér egy tömbhöz, egy blokkot kell írnia try-catchannak ellenőrzésére, hogy az index túllépte-e a határokat. Minden spagetti kód lenne, és teljesen olvashatatlan. Érthető, hogy ezt az ötletet elvetették. Ennek eredményeként a nem ellenőrzött kivételeket nem kell blokkokban kezelni try-catchvagy újra dobni (bár ez technikailag lehetséges, mint az Error esetében).

Hogyan dobd ki a saját kivételedet

Természetesen a Java készítői nem láthatnak előre minden kivételes helyzetet, amely a programokban előfordulhat. Túl sok program van a világon, és túl sokfélék. Ez azonban nem aggodalomra okot adó ok, mert szükség esetén létrehozhat saját kivételt. Ezt nagyon könnyű megtenni. Csak annyit kell tennie, hogy létrehozza saját osztályát. Győződjön meg róla, hogy a neve "Kivétel"-re végződik. A fordító ezt nem követeli meg, de a kódot olvasó többi programozó azonnal megérti, hogy ez egy kivételosztály. Ezenkívül jelezze, hogy az osztály az osztálytól öröklődött Exception(a fordító ezt megköveteli). Tegyük fel például, hogy van egy Dogosztályunk. A kutyát sétáltathatjuk awalk()módszer. Mielőtt azonban ezt megtennénk, ellenőriznünk kell, hogy kedvencünk visel-e nyakörvet, pórázt és szájkosárt. Ha bármelyik felszerelés hiányzik, saját kivételt dobunk: DogIsNotReadyException . A kódja így néz ki:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Annak jelzésére, hogy az osztály kivétel, az osztály neve után be kell írnia, hogy " expons Exception " (ez azt jelenti, hogy "az osztály az Exception osztályból származik"). A konstruktorban egyszerűen meghívjuk az Exceptionosztálykonstruktort a String üzenettel ( ha kivétel történik, akkor az üzenetet, a hiba leírását megmutatjuk a felhasználónak). Így néz ki ez osztálykódunkban:

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("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
Most a módszerünk walk()egy DogIsNotReadyException kivételt dob . Ez a dobás kulcsszóval történik. Mint korábban említettük, a kivétel egy objektum. Tehát, ha kivétel történik (a kutyának hiányzik valami) a módszerünkben, létrehozunk egy új DogIsNotReadyExceptionobjektumot, és dobjuk a dobás kulcsszó használatával. A metódus deklarációjához hozzáadjuk a " dobja a DogIsNotReadyException " kifejezést. Vagyis most már a fordító is tisztában van azzal, hogy a walk()metódus meghívása rendkívüli helyzetté válhat. Ennek megfelelően ezt a kivételt kezelni kell, ha ezt a metódust valahol a programunkban meghívjuk. Próbáljuk meg ezt a módszerrel main():

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
Ez nem fordítódik le. A kivételt nem kezelik! A kódunkat blokkba csomagoljuk try-catcha kivétel kezelésére:

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
Most nézzük a konzol kimenetét: A nyakörv be van kapcsolva! A szájkosár rajta van! Sétára készülünk! Buddy nem áll készen a sétára! Ellenőrizze a felszerelést! A felszerelés ellenőrzése! A nyakörv rajta van? igaz Van a póráz? false Van a szájkosár? true Nézd meg, mennyivel informatívabb volt a konzol kimenet! Látunk minden lépést a programban; látjuk, hol történt a hiba, és azt is azonnal láthatjuk, hogy pontosan mi hiányzik a kutyánknak. :) És így teremted meg a saját kivételeidet. Amint látja, nincs ebben semmi bonyolult. És annak ellenére, hogy a Java készítői nem vették a fáradságot, hogy a nyelvbe külön kivételt tegyenek a gyengén felszerelt kutyák számára, javítottuk a tévedésüket. :)

További olvasnivalók:

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION