„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.