2016-04-17 2 views
1

Общий совет для исключения исключений заключается в том, что лучше быть конкретным, а не просто перехватывать исключения из самого широкого класса: java.lang.Exception.Не удается получить конкретное исключение, используя ExecutorService и Callables?

Но, похоже, единственным исключением из вызываемого является 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(); 
    } 
} 

В приведенном выше коде, я хотел бы поймать NumberFormatException, но я не могу показаться, чтобы поймать что-нибудь, кроме ExecutionException.

Если существует несколько различных исключений, выведенных из метода вызова, как кто-то поймает разные исключения отдельно?

ответ

4

Вы всегда получите ExecutionException. Исключение root будет установлено как причина. Вызовите getCause() на примере ExecutionException, чтобы получить фактическое исключение, которое было выброшено в Callable.

Смежные вопросы