Java - 从集合中查找最具体的异常超类

时间:2016-12-10 01:46:22

标签: java exception exception-handling

假设我有一组异常类,例如:

Exception
RuntimeException
IllegalArgumentException
IOException
FileNotFoundException

当给出一个异常类作为参数时,我想从集合中找到该类,该类是我给定类的最特定的超类。因此,如果我得到InvalidKeyException,我想找到IllegalArgumentException而不是Exception或RuntimeException。如果给定的类是我的集合,我想返回类本身(提供IOException返回IOException等)。我怎么能用Java做到这一点?每当有一个包含多个catch语句的try块时,JVM(或编译器)必须解决这个问题,但是在给定set和参数的情况下我无法知道如何做到这一点。

提前非常感谢:)

编辑:澄清。不抛出异常,我有一个它的实例,我作为我的方法的参数提供(我可以手动抛出它,但我宁愿没有,因为这是不优雅/糟糕的性能)

2 个答案:

答案 0 :(得分:2)

这是一种做你想要的方法(我想)。请注意,这是非常脆弱的,如果继承的结构完全复杂,这可能无法解决您满意的类型。我真的鼓励你重新思考如何解决这个问题。

public class Dubious
{
   static private List<Class<? extends Exception>> types = 
           Arrays.asList( Exception.class, FileNotFoundException.class,
                   IOException.class, IllegalArgumentException.class,
                   RuntimeException.class );

   public static void main(String[] args) {
      processException( new InvalidKeyException() );
      processException( new SocketException() );
      processException( new IllegalArgumentException() );
      processException( new Exception() );
   }

   public static void processException( Exception ex ) {
      Class<?> exType = ex.getClass();
      while( !types.contains( exType ) ) 
         exType = exType.getSuperclass();
      System.out.println( exType );
   }
}

输出:

run:
class java.lang.Exception
class java.io.IOException
class java.lang.IllegalArgumentException
class java.lang.Exception
BUILD SUCCESSFUL (total time: 0 seconds)

答案 1 :(得分:0)

不确定你为什么要这样做,但是:

import java.util.HashSet;


public class Test {
  public static void main(String[] args) {
    HashSet<Class> set = new HashSet<>();

    set.add(RuntimeException.class);
    set.add(IllegalArgumentException.class);
    set.add(ArithmeticException.class);
    try {
      int a = 1;
      int b = 0;
      int x = a/b;
    }catch(Exception ex) {
      if (set.contains(ex.getClass())) {
        System.out.println("Yes");
      } else {
        System.out.println("got "+ex);
      }
    }
  }
}