5
public class try
{
    public static void main(String[] args)
    {
        try
        {
            if(true)
                throw new A();
            if(true)
                throw new B();
        }
        catch( A | B e)
        {
            e.doit();
        }
    }
}

class A extends Exception
{
    public void doit() {}
}

class B extends Exception
{
    public void doit() {}
}

これはコンパイルされません

18: error: cannot find symbol
        e.doit();
         ^
symbol:   method doit()
location: variable e of type Exception

変数は、実際の型ではなくe型として終了するようです。これは、コンパイルの型でコンパイラがどのような種類がスローされるかを知らないため、論理的に見えます。ただし、共通の基本クラスから派生させたり、共通のインターフェイスを実装したりするExceptionことなく、これを機能させる方法はありAますか?B

4

3 に答える 3

1

インターフェイスを使用しない場合は、代わりに instanceof を使用できますか。少し退屈です。ところで、2 つの例外を個別にキャッチするために 2 つの catch ブロックを記述しないのはなぜですか。

public class Try
{
    public static void main(String[] args)
    {
        try
        {
            if(true)
                throw new A();
            if(true)
                throw new B();
        }
        catch(A | B e)
        {
            if(e instanceof A){
                ((A) e).doit();             
            }else if (e instanceof B){
                ((B) e).doit();             
            }
        }
    }
}

class A extends Exception 
{
    public void doit() {}
}

class B extends Exception 
{
    public void doit() {}
}

別の方法は、リフレクトを使用することです。

package com.stackoverflow;

import java.lang.reflect.Method;

public class Try
{
    public static void main(String[] args) throws Exception
    {
        try
        {
            if(true)
                throw new A();
            if(true)
                throw new B();
        }
        catch(A | B e)
        {
            Class cls = e.getClass();  
            Method doit = cls.getMethod("doit");
            doit.invoke(e, null);
        }
    }
}

class A extends Exception
{
    public void doit() {}
}

class B extends Exception
{
    public void doit() {}
}

インターフェイスが役立つ場合があります。

于 2014-10-17T09:24:21.607 に答える
1

次のように、A と B の両方が拡張するスーパー クラスを作成し、そのクラスに doIt() メソッドを指定してから、A と B の両方にそのメソッドを実装するだけです。

  class A extends C {
    public void doit() {
    }
  }

  class B extends C {
    public void doit() {
    }
  }

  abstract class C extends Exception {
    public abstract void doit();
  }

次に、次のように C をキャッチできます。

try
{
  if(true)
    throw new A();
  if(true)
    throw new B();
}
catch( C e)
{
  e.doit();
}
于 2014-10-17T09:19:49.663 に答える