2017-04-11 4 views
1

Toutefois testCase2 ne gère pas l'exception et génère une erreur. Est-ce que je manque quelque chose? Désolé si je l'ai fait, assez nouveau pour cela.Attendez le même résultat de ces deux 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(); 
} 

Répondre

2

Cependant testCase2 ne gère pas l'exception

Votre testCase2 ne l'exception traitées, vous pouvez ajouter print déclaration supplémentaire pour le vérifier.

La raison testCase2 renvoie une exception est que le code:

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

retournera une nouvelle CompletableFuture mais vous venez de le jeter, est toujours pas enregistré la cf variable cf.get avec un gestionnaire d'exceptions. Le code devrait être:

@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

merci. Je me sens tellement stupide. :/ – slee

+0

Pas un gros problème, juste une erreur commune tout le monde fait en apprenant :-) – shizhz