2015-05-11 10 views
7

Ho il codice qui sotto.Come lanciare l'eccezione personalizzata controllata con espressione lambda java8?

private static void readStreamWithjava8() { 

    Stream<String> lines = null; 

    try { 
     lines = Files.lines(Paths.get("b.txt"), StandardCharsets.UTF_8); 
     lines.forEachOrdered(line -> process(line)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (lines != null) { 
      lines.close(); 
     } 
    } 
} 

private static void process(String line) throws MyException { 
    // Some process here throws the MyException 
} 

Ecco il mio metodo process(String line) genera l'eccezione verificata e sto chiamando il metodo che dall'interno del lambda. A quel punto è necessario gettare il MyException dal metodo readStreamWithjava8() senza lanciare RuntimeException.

Come posso fare questo con java8?

+3

Nota: è possibile utilizzare try-with-resources con 'Files.lines()' – assylias

+0

@assylias Puoi condividere qualche codice di esempio? – user3496599

+1

'try (Stream lines = Files.lines (Paths.get (...))) {...}' e rimuovi il blocco finally. – assylias

risposta

5

La risposta breve è che non è possibile. Questo perché forEachOrdered prende uno Consumer e Consumer.accept non è dichiarato per generare eccezioni.

La soluzione è di fare qualcosa di simile

List<MyException> caughtExceptions = new ArrayList<>(); 

lines.forEachOrdered(line -> { 
    try { 
     process(line); 
    } catch (MyException e) { 
     caughtExceptions.add(e); 
    } 
}); 

if (caughtExceptions.size() > 0) { 
    throw caughtExceptions.get(0); 
} 

Tuttavia, in questi casi, io di solito gestire l'eccezione all'interno del metodo process, o farlo nel modo vecchia scuola con for-loop.