假设我有一组异常类,例如:
Exception
RuntimeException
IllegalArgumentException
IOException
FileNotFoundException
当给出一个异常类作为参数时,我想从集合中找到该类,该类是我给定类的最特定的超类。因此,如果我得到InvalidKeyException,我想找到IllegalArgumentException而不是Exception或RuntimeException。如果给定的类是我的集合,我想返回类本身(提供IOException返回IOException等)。我怎么能用Java做到这一点?每当有一个包含多个catch语句的try块时,JVM(或编译器)必须解决这个问题,但是在给定set和参数的情况下我无法知道如何做到这一点。
提前非常感谢:)
编辑:澄清。不抛出异常,我有一个它的实例,我作为我的方法的参数提供(我可以手动抛出它,但我宁愿没有,因为这是不优雅/糟糕的性能)答案 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);
}
}
}
}