2016-12-10 5 views
0

最も特定の例外のスーパークラスを探す:ジャワ - の私は例外クラス、例えばのセットを持っているとしましょうセットの中から

Exception 
RuntimeException 
IllegalArgumentException 
IOException 
FileNotFoundException 

引数として例外クラスを与えられたとき、私はからクラスを見つけたいです私の与えられたクラスの中で最も特定のスーパークラスです。したがって、InvalidKeyExceptionが与えられた場合、IllegalArgumentExceptionを検索し、ExceptionまたはRuntimeExceptionは検索しません。指定されたクラスが私のセットであれば、クラス自体を返したい(IOExceptionがIOExceptionを返すなど)。 Javaでこれをどうやって行うことができますか? JVM(またはコンパイラ)は、複数のcatchステートメントがあるtryブロックがあるたびにこの問題を解決する必要がありますが、セットと引数を指定して実行する方法はわかりません。

事前に感謝します:)

EDIT:明確化。例外はスローされません。私はメソッドの引数として提供されているインスタンスを持っています(私はそれを手動でスローすることができますが、私はむしろそれが非効率的/悪いパフォーマンスではないと思います)。

+1

は、私が聞いてもいいですか?このような音は[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+0

これまでに何を試みましたか? – YoungSpice

+0

ちょうどそれらすべてをキャッチします。順序が間違っていれば、コンパイラはあなたに何かを伝えます。実行時にこれをサポートするコードを書く必要はありません。 – EJP

答えて

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) 
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); 
     } 
    } 
    } 
} 
関連する問題