Féljen a hibáktól, de ne írja be őket Java nyelven! Valószínűleg már tud néhány dolgot a Java kivételeiről . Ma legalább egy felületes tudás hasznodra válik. Elemezzük az Error osztályt és egy különleges kivételtípust, amely sok embert megrémít, amikor megjelenik a veremnyomokban.

A Java kivételhierarchiájának tetején a Throwable osztály áll, amelynek két leszármazottja van:

  • Kivétel , amely felelős a program hibáiért.
  • És a mai hősünk – Error , amely a JVM hibáiért felelős.
    Érdemes megemlíteni, hogy ezek valószínűleg nem is kódolási hibák, sokkal inkább olyan problémák, amelyek általában nem a fejlesztőn múlnak.

Mi a teendő egy hibával

„Hibák” észlelésekor a naplózáson kívül nem hajthat végre semmilyen műveletet a fogási blokkban , mivel magának a JVM-nek a problémáiról beszélünk.

A naplózás jó: ha futásidejű hibát kap, megnézheti a naplókat, megnézheti az okát, és tudja, mit kell javítani.

Mivel nem tudja, milyen hibát kaphat a kód írásakor, nincs értelme egy adott típust beírni a catch blokkba. Maga az Error osztály használata sem a legjobb megoldás, mivel ebben az esetben csak a hibákat fogod fel.

Ennek megfelelően jobb a Throwable osztályt használni, amely képes mind az Error , mind az Exception elkapni . Hogyan néz ki ez a gyakorlatban?

Nem helyes ilyen kódot írni:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Az ilyen kód írása szintén nem megfelelő:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
De az ilyen kód rendben van:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

A második lehetőség a hibák kezelésére, hogy magasabbra dobja őket, miután deklarált egy throws záradékot a metóduson. Ezt a technikát akkor alkalmazzák, ha a kód elméletileg hibát okozhat, és előre figyelmeztetni akar mindenkit, aki esetleg használja a kódot, hogy megfelelően kezelni tudja a hibát.

Gyakori hibák

A legnépszerűbb hibák az OutOfMemoryError és a StackOverflowError osztályok.

Az OutOfMemoryError gyakran megjelenik, ha a programnak nincs elég memóriája az objektumok létrehozásához, és a szemétgyűjtő nem tud lépést tartani. Az eredmény egy OutOfMemoryError .

A Java nem teszi lehetővé az objektumok manuális törlését a memóriaszivárgás megelőzése érdekében, de elkerülheti a szemetelést, hogy ne terhelje túl a szemétgyűjtőt, és ne zsúfolja el a kupacot.

Például egy ilyen kód sok szemetet hoz létre a memóriában:


while (true) {
    new Object();
}

A második hiba, amelyről beszélni szeretnék, a StackOverflowError , amely akkor jelenik meg, amikor a verem túlcsordul. Mivel a verem főként helyi változókat, paramétereket és metódushívásokat tárol, a rekurzió (vagy egy rekurzív metódushívás) nagyon gyakori oka ennek a hibának:


public void foo() {
    foo();
}

A programvégrehajtás során fellépő problémák elkerülése érdekében a modern IDE-k gyakran figyelmeztetnek a metódusok rekurzív meghívására.

Nem javíthat ki olyan programot, amely hibákat dob , de írhat olyan kódot, amely nem okoz hibát és nem töri meg a programot. Figyelje meg, mit csinál a memóriával, gondosan hozzon létre objektumokat, és hívja meg helyesen a metódusokat. Ha így tesz, akkor kevesebb probléma lesz a kóddal.

Különbség a hiba és a kivétel típusok között

Hiba Kivétel
A fogásblokkban nem javítható Fogóblokkban kezelhető _
Nem fordul elő fordítási időben Fordítási időben elkapható
Problémák a JVM-ben Problémák a kódlogikában
Az összes hiba nincs bejelölve ellenőrzött és ellenőrizetlen

A Java kivételeit nem lehet elkerülni, de nem kell félni tőlük. Csak meg kell értenie, hogy az egyes típusok mit képviselnek, és tudnia kell, hogyan kell kezelni őket. Ez minden mára! Találkozunk!