Java-从集合中查找最特定的异常超类

Java-从集合中查找最特定的异常超类,java,exception,exception-handling,Java,Exception,Exception Handling,假设我有一组异常类,例如: Exception RuntimeException IllegalArgumentException IOException FileNotFoundException 当给定一个异常类作为参数时,我想从集合中找到一个类,它是给定类中最具体的超类。所以,如果给我InvalidKeyException,我希望找到IllegalArgumentException,而不是Exception或RuntimeException。如果给定的类是我的集合,我想返回类本身(提供I

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

Exception
RuntimeException
IllegalArgumentException
IOException
FileNotFoundException
当给定一个异常类作为参数时,我想从集合中找到一个类,它是给定类中最具体的超类。所以,如果给我InvalidKeyException,我希望找到IllegalArgumentException,而不是Exception或RuntimeException。如果给定的类是我的集合,我想返回类本身(提供IOException返回IOException等)。我如何在Java中做到这一点?每当有一个包含多个catch语句的try块时,JVM(或编译器)都必须解决这个问题,但是我无法找到如何在给定一个集合和一个参数的情况下解决这个问题

非常感谢:)


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

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

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);
      }
    }
  }
}
import java.util.HashSet;
公开课考试{
公共静态void main(字符串[]args){
HashSet=newhashset();
set.add(RuntimeException.class);
add(IllegalArgumentException.class);
add(arithmetricexception.class);
试一试{
INTA=1;
int b=0;
INTX=a/b;
}捕获(例外情况除外){
if(set.contains(例如getClass())){
System.out.println(“是”);
}否则{
System.out.println(“got”+ex);
}
}
}
}

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

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);
      }
    }
  }
}
import java.util.HashSet;
公开课考试{
公共静态void main(字符串[]args){
HashSet=newhashset();
set.add(RuntimeException.class);
add(IllegalArgumentException.class);
add(arithmetricexception.class);
试一试{
INTA=1;
int b=0;
INTX=a/b;
}捕获(例外情况除外){
if(set.contains(例如getClass())){
System.out.println(“是”);
}否则{
System.out.println(“got”+ex);
}
}
}
}

这里有一个方法可以满足您的需求(我想)。请注意,这是非常脆弱的,如果您的继承结构非常复杂,那么这可能无法满足您的需求。我真的鼓励你重新思考你是如何解决这个问题的

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 );
   }
}

这里有一个方法可以满足您的需求(我认为)。请注意,这是非常脆弱的,如果您的继承结构非常复杂,那么这可能无法满足您的需求。我真的鼓励你重新思考你是如何解决这个问题的

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 );
   }
}

请问你为什么要这样做?听起来这可能是一个问题,你到目前为止都在尝试什么?抓住他们就行了。如果您有任何问题,编译器会告诉您是哪些问题。您不想在运行时编写代码来支持这一点。@Vince Emigh-肯定是XY问题。我正在编写一个JAX-RS异常处理程序,我想简化样板文件,因为我处理它们都是一样的——我得到一个状态代码、错误代码和描述,然后将它们格式化为客户端的响应。在过去,我通过一个抽象异常处理程序和一个子类来处理我想要处理的每种类型的异常。这使得我的类变得很小,但我仍然必须为每个异常类型设置一个类,这是非常多的。我希望有一个处理程序捕获所有在映射中查找有关异常信息的异常。请参阅@YoungSpice还没有尝试过任何东西,实现这一点的算法不会那么复杂,但我不想自己编写/维护它。我希望已经有一些代码可以帮我做到这一点。请问你为什么要这么做?听起来这可能是一个问题,你到目前为止都在尝试什么?抓住他们就行了。如果您有任何问题,编译器会告诉您是哪些问题。您不想在运行时编写代码来支持这一点。@Vince Emigh-肯定是XY问题。我正在编写一个JAX-RS异常处理程序,我想简化样板文件,因为我处理它们都是一样的——我得到一个状态代码、错误代码和描述,然后将它们格式化为客户端的响应。在过去,我通过一个抽象异常处理程序和一个子类来处理我想要处理的每种类型的异常。这使得我的类变得很小,但我仍然必须为每个异常类型设置一个类,这是非常多的。我希望有一个处理程序捕获所有在映射中查找有关异常信息的异常。请参阅@YoungSpice还没有尝试过任何东西,实现这一点的算法不会那么复杂,但我不想自己编写/维护它。我希望有一些代码可以帮我做到这一点。