2016-04-17 7 views
1

Der allgemeine Hinweis zum Abfangen von Ausnahmen ist, dass es besser ist, spezifisch zu sein, anstatt nur Ausnahmen von der breitesten Klasse abzufangen: java.lang.Exception.Kann bestimmte Ausnahme mit ExecutorService und Callables nicht abfangen?

Aber es scheint, als wäre die einzige Ausnahme von Callable ExecutionException.

package com.company; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.*; 

public class ThreadTest { 

    private final static ArrayList<Callable<Boolean>> mCallables = new ArrayList<>(); 
    private final static ExecutorService mExecutor = Executors.newFixedThreadPool(4); 

    public static void main(String[] args) throws Exception{ 
     testMethod(); 
    } 

    static void testMethod() throws Exception { 

     mCallables.clear(); 

     for(int i=0; i<4; i++){ 
      mCallables.add(new Callable<Boolean>() { 

       @Override 
       public Boolean call() throws Exception { 
        //if (Thread.currentThread().isInterrupted()) { 
        // throw new InterruptedException("Interruption"); 
        //} 
        System.out.println("New call"); 

        double d = Double.parseDouble("a"); 

        return true; 
       } //end call method 

      }); //end callable anonymous class 
     } 
     try { 
      List<Future<Boolean>> f= mExecutor.invokeAll(mCallables); 
      f.get(1).get(); 
      f.get(2).get(); 
      f.get(3).get(); 
      f.get(0).get(); 

     } catch (NumberFormatException e) { 
      e.printStackTrace(); 
      System.out.println("Number Format exception"); 
     } catch (ExecutionException e) { 
      String s = e.toString(); 
      System.out.println(s); 
      System.out.println("Execution exception"); 
     } catch (Exception e) { 
      System.out.println("Some other exception"); 
     } 

     mExecutor.shutdown(); 
    } 
} 

In dem obigen Code, würde Ich mag Number fangen, aber ich kann nichts außer ExecutionException zu fangen scheinen.

Wenn mehrere verschiedene Ausnahmen von der Aufrufmethode ausgelöst werden, wie würde jemand die verschiedenen Ausnahmen getrennt abfangen?

Antwort

4

Sie erhalten immer eine ExecutionException. Die Root-Ausnahme wird als Ursache festgelegt. Rufen Sie getCause() auf der ExecutionException Instanz auf, um zu der tatsächlichen Ausnahme zu gelangen, die in Callable ausgelöst wurde.

Verwandte Themen