„Alattomos dobások” Java-ban
1. Áttekintés
Java-ban a sneaky dobás A koncepció lehetővé teszi számunkra, hogy minden bejelölt kivételt eldobjunk anélkül, hogy azt kifejezetten meghatároznánk a metódus aláírásában. Ez lehetővé teszi a dob nyilatkozat, amely hatékonyan utánozza a futásidejű kivétel jellemzőit.
Ebben a cikkben megnézzük, hogyan történik ez a gyakorlatban, néhány kódpéldát megnézve.
2. Az alattomos dobásokról
Az ellenőrzött kivételek a Java részét képezik, nem a JVM-et. A bájtkódban bárhonnan kivethetünk kivételeket, korlátozások nélkül.
A Java 8 új típusú következtetési szabályt hozott, amely kimondja, hogy a dob T arra következtetnek RuntimeException amikor csak megengedett. Ez lehetővé teszi a sunyi dobások megvalósítását a segítő módszer nélkül.
Probléma van alattomos dobások az, hogy valószínűleg el akarja érni a kivételeket, de a Java fordító nem teszi lehetővé, hogy az egyes kiviteltípusok kivételével kezelje az alattomosan dobott bejelölt kivételeket.
3. alattomos dobások akcióban
Mint már említettük, a fordító és a Jave Runtime különböző dolgokat láthat:
public static void sneakyHajítás (dobható e) dobja E {dobja (E) e; } private static void throwsSneakyIOException () {sneakyThrow (új IOException ("alattomos")); }
A fordító látja az aláírást a dob T arra következtetett, hogy a RuntimeException típus, így lehetővé teszi az ellenőrizetlen kivétel terjedését. A Java Runtime nem lát semmilyen típust a dobásokban, mivel az összes dobás ugyanaz, egy egyszerű dobja e.
Ez a gyors teszt bemutatja a forgatókönyvet:
@Test public void whenCallSneakyMethod_thenThrowSneakyException () {try {SneakyThrows.throwsSneakyIOException (); } catch (Exception ex) {assertEquals ("alattomos", ex.getMessage (). toString ()); }}
Lehet dobni egy ellenőrzött kivételt bytecode manipulációval, vagy Thread.stop (dobható), de rendetlen és nem ajánlott.
4. A Lombok Annotations használata
A @ SneakyThrows A Lombok kommentárja lehetővé teszi az ellenőrzött kivételek dobását a dob nyilatkozat. Ez jól jön, ha kivételt kell hozni egy módszer alól olyan nagyon korlátozó felületeken belül, mint például Futható.
Tegyük fel, hogy kivételt dobunk a belülről Futható; csak a Cérna's kezeletlen kivételkezelő.
Ez a kód dobja a Kivétel például, így nincs szükség arra, hogy becsomagolja a Futásidejű kivétel:
public class SneakyRunnable megvalósítja Runnable {@SneakyThrows (InterruptedException.class) public void run () {dobja új InterruptedException (); }}
Ennek a kódnak a hátránya, hogy nem lehet befogadni egy be nem jelentett bejelölt kivételt; tehát nem fog összeállítani.
Ez a helyes forma a sunyi kivétel eldobásához:
@SneakyThrows public void run () {try {dobd be az új InterruptedException () -t; } catch (InterruptedException e) {e.printStackTrace (); }}
És itt van a teszt ennek a viselkedésnek:
@Test public void whenCallSneakyRunnableMethod_thenThrowException () {try {new SneakyRunnable (). Run (); } catch (e kivétel) {assertEquals (InterruptedException.class, e.getStackTrace ()); }}
5. Következtetés
Amint azt ebben a cikkben láttuk, a Java fordító trükközhet, hogy az ellenőrzött kivételeket ellenőrizhetetlennek tekinti.
Mint mindig, a kód elérhető a GitHubon.