Használat
Try-catch-finally, try-with-resources és multi-catch
Használat
A try-catch-finally és a try-with-resources a kivételek kezelése mellett erőforrás-felszabadítást is szabályoz.
1. Definíció
Az exception kezelés használati oldala azt mutatja meg, hogyan fogsz el hibát, hogyan reagálsz rá, és mikor szabadítasz fel erőforrást. Interjún itt nemcsak a szintaxis számít, hanem a vezérlési folyamat pontos megértése is.
A téma erősen kapcsolódik I/O-hoz, adatbázis-műveletekhez és tranzakciókhoz. A finally és a try-with-resources körüli finomságok klasszikus interjúkérdések.
2. Alapfogalmak
| Fogalom | Jelentés | Miért fontos |
|---|---|---|
try |
A kivételt dobó kód blokkja | Itt fut a védett logika. |
catch |
Hibakezelő ág | Specifikus kivételt célszerű fogni. |
finally |
Mindig lefutó tisztítási blokk | Erőforrás-felszabadításra régi megoldás. |
| try-with-resources | Automatikus resource kezelés | Az AutoCloseable objektumokat zárja. |
| suppressed exception | Másodlagos, elnyomott kivétel | Try-with-resources esetén fontos diagnosztikai részlet. |
- A
catchblokkok sorrendje számít: a specifikusabb kivételnek kell előbb jönnie. - A
finallynormál és exceptionális úton is lefut, kivéve nagyon speciális eseteket, például JVM leállás. - A try-with-resources a legbiztonságosabb alapértelmezett forma fájlokhoz, streamekhez, JDBC erőforrásokhoz.
- Suppressed exception esetén a zárás során keletkező kivétel nem veszik el teljesen, hanem a fő kivételhez kapcsolódik.
3. Gyakorlati használat
A(z) Használat témában a legfontosabb gyakorlati kérdés mindig az, hogy milyen use-case-re választasz eszközt. A jó interjúválasz itt nem csak azt mondja meg, mit lehet csinálni, hanem azt is, mikor érdemes és mikor nem.
- Preferáld a try-with-resources megoldást minden
AutoCloseableerőforrásnál. - A
catchblokkban vagy kezeld érdemben a hibát, vagy fordítsd át értelmesebb kivétellé; az üres catch blokk anti-pattern. - A
finallyblokkba ne írj olyan logikát, ami felülírja vagy elrejti az eredeti exceptiont. - Interjún jó pont, ha megemlíted a multi-catch lehetőséget és a suppressed exception fogalmát.
4. Kód példák
Egyszerű példa
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public String firstLine(String path) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
return reader.readLine();
}
}
}
Haladó példa
public class FinallyFlow {
public static int demo() {
try {
return 1;
} finally {
System.out.println("cleanup still runs");
}
}
public static void main(String[] args) {
System.out.println(demo());
}
}
A kódpéldák interjún azért hasznosak, mert megmutatják, hogy a fogalmi szintű tudást le tudod fordítani konkrét API-használatra. Ha röviden el tudod magyarázni, miért így írod a példát, az általában többet ér, mint egy túlbonyolított demo.
5. Trade-offok
| Szempont | Előny | Hátrány |
|---|---|---|
finally |
Egyszerű tisztítási hely | Könnyű vele elrejteni eredeti hibát, ha rosszul használod |
| try-with-resources | Automatikus és biztonságos zárás | Csak AutoCloseable típusokra működik közvetlenül |
Széles catch(Exception) |
Gyorsan összefog sok hibát | Diagnosztikailag gyenge és túl általános |
6. Gyakori hibák
- ❌ Rossz: Üres catch blokkot hagysz. ✅ Helyes: Legalább logolj, fordítsd át, vagy kezeld érdemben a hibát.
- ❌ Rossz: A
finallyblokkbanreturn-t használsz. ✅ Helyes: Kerüld, mert elnyomhatja az eredeti vezérlési utat vagy exceptiont. - ❌ Rossz: Manuálisan zárod az erőforrást mindenhol try-with-resources helyett. ✅ Helyes: AutoCloseable esetén használd a nyelvi támogatást.
7. Senior szintű meglátások
Senior szemmel a hibakezelés olvashatósági kérdés is. A túl sok egymásba ágyazott try-catch rontja a karbantarthatóságot, ezért érdemes réteghatároknál kezelni a hibát.
Follow-up interjúkérdés: mi a különbség a fő exception és a suppressed exception között? Try-with-resources esetén a művelet közbeni hiba a fő kivétel, a close közbeni hiba suppressed lesz.
A jó exception usage nem csak technikai helyesség, hanem diagnosztikai minőség is: megőrzi az eredeti contextet, stack trace-t és domain jelentést.
Tipikus follow-up interjúkérdések:
- Hogyan magyaráznád el röviden a(z) Használat témát egy junior fejlesztőnek?
- Milyen trade-offot látsz a(z) Használat kapcsán valós projektben?
- Milyen tipikus production hibát tudsz ehhez a témához kötni?
Senior gyakorlatban az exception kezelésnél különösen fontos, hogy a hibautak tesztelhetők és megfigyelhetők legyenek. Egy jól kialakított try-catch vagy try-with-resources blokk nem csak helyesen működik, hanem debug közben is egyértelművé teszi, hol keletkezett az eredeti hiba, és hol történt a cleanup vagy az exception translation.
8. Szószedet
| Kifejezés | Jelentés |
|---|---|
| try-with-resources | Nyelvi szerkezet automatikus erőforrás-záráshoz. |
| AutoCloseable | Olyan típus, amit a try-with-resources automatikusan lezár. |
| suppressed exception | A záráskor keletkezett, a fő kivételhez csatolt kivétel. |
| multi-catch | Több kivételtípus fogása egy catch ágban. |
| cleanup | Erőforrások felszabadítása, lezárása. |
9. Gyorsreferencia
catchsorrend: specifikustól az általános felé.finallyáltalában lefut.- Erőforráshoz default: try-with-resources.
- Ne hagyj üres catch blokkot.
- Suppressed exception-t is vizsgálhatsz diagnosztikánál.
Ha interjún elakadsz, a(z) Használat témánál mindig térj vissza a három alapelvhez: pontos definíció, tipikus use-case, és a legfontosabb trade-off vagy hiba.
🎮 Játékok
8 kérdés