Qual é o equivalente java de AggregateException de .net?

Em .net, a class AggregateException permite lançar uma exceção contendo várias exceções.

Por exemplo, você desejaria lançar um AggregateException se executasse várias tarefas em paralelo e algumas falhassem com exceções.

O java tem uma class equivalente?

O caso específico que eu quero usar em:

public static void runMultipleThenJoin(Runnable... jobs) { final List errors = new Vector(); try { //create exception-handling thread jobs for each job List threads = new ArrayList(); for (final Runnable job : jobs) threads.add(new Thread(new Runnable() {public void run() { try { job.run(); } catch (Exception ex) { errors.add(ex); } }})); //start all for (Thread t : threads) t.start(); //join all for (Thread t : threads) t.join(); } catch (InterruptedException ex) { //no way to recover from this situation throw new RuntimeException(ex); } if (errors.size() > 0) throw new AggregateException(errors); } 

Eu não estou ciente de nenhuma class interna ou biblioteca, como eu nunca mesmo de querer fazer isso antes (normalmente você apenas encadearia as exceções), mas não seria tão difícil de se escrever.

Você provavelmente escolheria uma das Exceções para ser “primária”, para que possa ser usada para preencher os registros de pilha, etc.

 public class AggregateException extends Exception { private final Exception[] secondaryExceptions; public AggregateException(String message, Exception primary, Exception... others) { super(message, primary); this.secondaryExceptions = others == null ? new Exception[0] : others; } public Throwable[] getAllExceptions() { int start = 0; int size = secondaryExceptions.length; final Throwable primary = getCause(); if (primary != null) { start = 1; size++; } Throwable[] all = new Exception[size]; if (primary != null) { all[0] = primary; } Arrays.fill(all, start, all.length, secondaryExceptions); return all; } } 

O Throwable.addSuppressed (Throwable) do Java 7 fará algo semelhante, embora tenha sido construído para um propósito um pouco diferente ( try-with-resource )

Você pode representar vários taska como

 List> tasks 

Então, se você quiser que o computador realmente faça em paralelo

 ExecutorService executorService = .. initialize executor Service List> results = executorService.invokeAll ( ) ; 

Agora você pode percorrer os resultados.

 try { T val = result . get ( ) ; } catch ( InterruptedException cause ) { // this is not the exception you are looking for } catch ( ExecutionExeception cause ) { Throwable realCause = cause . getCause ( ) // this is the exception you are looking for } 

Então realCause (se existir) é qualquer exceção que é lançada em sua tarefa associada.

Eu realmente não vejo porque você deve usar exceções para marcar as tarefas como incompletas / falhadas, mas em qualquer caso, não deve ser difícil criar uma. Tem algum código para compartilhar para que possamos ajudá-lo com uma resposta mais específica?