2017-04-11 1 views
1

Allerdings behandelt testCase2 die Ausnahme nicht und löst einen Fehler aus. Fehle ich etwas? Tut mir leid, wenn ich das tat, ziemlich neu.Erwartet die gleichen Ergebnisse von diesen beiden CompletableFutures

@Test 
public void testCase1() throws Exception { 
    CompletableFuture.supplyAsync(() -> { 
     if (true) throw new RuntimeException(); 
     return "Promise"; 
    }).exceptionally((ex) -> { 
     return "Fake Promise"; 
    }).get(); 
} 

@Test 
public void testCase2() throws Exception { 
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> { 
     if (true) throw new RuntimeException(); 
     return "Promise"; 
    }); 
    cf.exceptionally((ex) -> { 
     return "Fake Promise"; 
    }); 
    cf.get(); 
} 

Antwort

2

jedoch testCase2 behandelt nicht der Ausnahme

Ihre testCase2 die Ausnahme behandelt hat, können Sie zusätzliche print Anweisung hinzufügen, es zu überprüfen.

Der Grund testCase2 eine Ausnahme auslöst, dass Code ist:

cf.exceptionally((ex) -> { 
     System.out.println("Fake Promise: " + System.nanoTime()); 
     return "Fake Promise"; 
    }) 

wird eine neue CompletableFuture zurückkehren, aber sie einfach verwerfen, die Variable cf in cf.get ist noch nicht mit einem Exception-Handler registriert. Der Code sollte sein:

@Test 
public void testCase2() throws Exception { 
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> { 
     if (true) throw new RuntimeException(); 
     return "Promise"; 
    }); 
    CompletableFuture<String> handledCf = cf.exceptionally((ex) -> { 
     return "Fake Promise"; 
    }); 
    return handledCf.get(); 
} 
+0

danke. Ich fühle mich so dumm. :/ – slee

+0

Keine große Sache, nur ein häufiger Fehler, den jeder beim Lernen macht :-) – shizhz

Verwandte Themen