Kurzusok
/
Java
Java
/
Tanterv
/
Kivételek
Ki

Kivételek ebben a kurzusban: Java

25 feladat

A(z) Kivételek fogalomról

A Java programozási nyelv kivételekkel kezeli a hibákat és más rendkívüli eseményeket.

Mi az a kivétel

A kivétel egy olyan esemény, amely egy program végrehajtása során következik be, és megzavarja az utasítások normál folyását. A kivételeket Java-ban explicit módon váltjuk ki, és a kiváltás műveletét a kivétel dobásának nevezzük. A kivétel kezelésének műveletét pedig a kivétel elkapásának nevezzük.

Java-ban minden kivétel az Exception osztály leszármazottja, amely maga is a Throwable leszármazottja.

A Java kétféle kivételt különböztet meg:

  1. Ellenőrzött kivételek
  2. Nem ellenőrzött kivételek

Ellenőrzött kivételek

Az ellenőrzött kivételek olyan rendkívüli állapotok, amelyekre egy alkalmazásnak számítania kell, és amelyekből fel is kell tudnia épülni. Ilyen ellenőrzött kivétel például a FileNotFoundException, amely akkor keletkezik, amikor egy metódus olyan fájlt próbál beolvasni, amely nem létezik.

Ezt a típusú kivételt a fordító ellenőrzi fordítási időben: azoknak a metódusoknak, amelyek ellenőrzött kivételt dobnak, ezt a metódus szignatúrájában is jelezniük kell, és az olyan kódnak, amely esetleg ellenőrzött kivételt dobó metódust hív, kezelnie kell a kivételt, különben a kód nem fordul le.

Minden ellenőrzött kivétel az Exception olyan leszármazottja, amely nem származik a RuntimeException-ből.

Nem ellenőrzött kivételek

A nem ellenőrzött kivételek olyan rendkívüli állapotok, amelyekre egy alkalmazás általában nem tud számítani, és amelyekből nem is tud felépülni. Ilyen nem ellenőrzött kivétel például a NullPointerException, amely akkor keletkezik, amikor egy metódus nem null értéket vár, de null-t kap.

Ezt a típusú kivételt a fordító nem ellenőrzi fordítási időben: azoknak a metódusoknak, amelyek nem ellenőrzött kivételt dobnak, nem kell ezt a metódus szignatúrájában jelezniük, és az olyan kódnak sem kell kezelnie, amely esetleg nem ellenőrzött kivételt dobó metódust hív.

Minden nem ellenőrzött kivétel a RuntimeException-ből származik, amely maga az Exception kiterjesztése.

Kivételek dobása

Egy metódus Java-ban a throw utasítás segítségével dobhat kivételt.

Ellenőrzött kivétel dobása

Amikor egy metódusból ellenőrzött kivételt dobunk, ezt a metódus szignatúrájában a throws kulcsszó segítségével jelezni kell, ahogy az alábbi példa mutatja. Ez arra kényszeríti a hívó kódot, hogy számítson rá, hogy kivétel dobódhat, és ennek megfelelően kezelje azt.

public class InsufficientBalanceException extends Exception {

}

public class BankAccount {
  public void withdraw(double amount) throws InsufficientBalanceException {
    if (balance < amount) {
      throw new InsufficientBalanceException();
    }

    // rest of the method implementation
  }
}

Nem ellenőrzött kivétel dobása

Amikor egy metódusból nem ellenőrzött kivételt dobunk, ezt nem kötelező jelezni a metódus szignatúrájában, bár ez is támogatott.

public class BankAccount {
  public void withdraw(double amount) {
    if (amount < 0) {
      throw new IllegalArgumentException("Cannot withdraw a negative amount");
    }

    // rest of the method implementation
  }
}

Kivételek kezelése

A kivételek kezelése Java-ban a try, a catch és a finally kulcsszóval történik.

  • Azokat az utasításokat, amelyek kivételt dobhatnak, érdemes egy try blokkba foglalni.
  • A try blokkot egy vagy több catch blokk követi, amelyek elkapják a try blokkban dobott kivételeket.
  • A catch blokkokat opcionálisan egy finally blokk követi, amely a try blokk után mindig lefut, függetlenül attól, hogy történt-e kivétel vagy sem.

A következő példa megmutatja, hogyan működnek ezek a kulcsszavak:

public class ATM {
  public void withdraw(BankAccount bankAccount, double amount) {
    try {
      System.out.println("Withdrawing " + amount);
      bankAccount.withdraw(amount);
      System.out.println("Withdrawal succeeded");
    } catch (InsufficientBalanceException) {
      System.out.println("Withdrawal failed: insufficient balance");
    } catch (RuntimeException e) {
      System.out.println("Withdrawal failed: " + e.getMessage());
    } finally {
      System.out.println("Current balance: " + bankAccount.getBalance());
    }
  }
}

Ebben a példában, amikor nem dobódik kivétel, a következő jelenik meg:

Withdrawing 10.0
Withdrawal succeeded
Current balance: 5.0

Ha viszont a bankAccount.withdraw(amount) utasítás InsufficientBalanceException-t dob, akkor a következő jelenik meg:

Withdrawing 10.0
Withdrawal failed: insufficient balance
Current balance: 5.0

Vagy, ha a bankAccount.withdraw(amount) nem ellenőrzött kivételt dob, a következő jelenik meg:

Withdrawing -10.0
Withdrawal failed: Cannot withdraw a negative amount
Current balance: 5.0

Hibák

A Java-nak van egy külön kategóriája is, a hibák, amelyek egy alkalmazáson kívül eső komoly problémákat jelölnek. Ilyen hiba például az OutOfMemoryError, amely akkor keletkezik, amikor egy alkalmazás több memóriát próbál használni, mint amennyi a rendszerben elérhető.

A nem ellenőrzött kivételekhez hasonlóan a hibákat sem ellenőrzi a fordító fordítási időben. A különbség az, hogy rendszerszintű problémákat jelölnek, és általában nem az alkalmazás, hanem a Java virtuális gép vagy a környezet dobja őket. Az alkalmazásoknak általában nem kell megpróbálniuk elkapni vagy kezelni őket.

Java-ban minden hiba az Error osztályból származik.

Mikor ne használjunk kivételeket

Ahogy korábban már szó volt róla, a kivételek olyan események, amelyek megzavarják az utasítások normál folyását, és rendkívüli események kezelésére szolgálnak. Ezért nem javasolt a kivételeket a program folyásának vezérlésére használni az alkalmazásodban.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Kivételek fogalmat