Подтвердить что ты не робот

Выбрасывание нескольких исключений в методе интерфейса в java

Я хотел спросить, как упоминать об этом в моем интерфейсе

public class find(int x) throws A_Exception, B_Exception{
----
----
---
}

Я хочу сказать, что могу упомянуть одно исключение в интерфейсе, но как упомянуть в моем интерфейсе, что мой метод будет бросать два исключения А именно A и B...

упомянутый выше фрагмент кода работает только для A, а не для B... Help

public interface dictionary{ 
   public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException; 
}
...
 public class SortedArray implements dictionary{ 
   public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException {
 ---------
}

но когда я скомпилирую его... он говорит..

SortedArray.java:66: insert (int) в assign.SortedArray не может реализовать insert (int) в assign.dictionary; переопределенный метод не бросает assign.SortedArray.Duplicate_Element_FoundException public void insert (int x) бросает Dictionary_FullException

4b9b3361

Ответ 1

Вы можете объявить столько исключений, сколько хотите для вашего метода интерфейса. Но класс, который вы задали в своем вопросе, недействителен. Он должен читать

public class MyClass implements MyInterface {
  public void find(int x) throws A_Exception, B_Exception{
    ----
    ----
    ---
  }
}

Тогда интерфейс будет выглядеть следующим образом:

public interface MyInterface {
  void find(int x) throws A_Exception, B_Exception;
}

Ответ 2

Я думаю, что вы просите что-то вроде кода ниже:

public interface A
{
    void foo() 
        throws AException;
}

public class B
    implements A
{
    @Overrides 
    public void foo()
        throws AException,
               BException
    {
    }
}

Это не будет работать, если BException не является подклассом AException. Когда вы переопределяете метод, вы должны соответствовать сигнатуре, предоставляемой родителем, а исключения являются частью подписи.

Решение состоит в том, чтобы объявить, что интерфейс также выбрасывает BException.

Причиной этого является то, что вы не хотите использовать код:

public class Main
{
    public static void main(final String[] argv)
    {
        A a;

        a = new B();

        try
        {
            a.foo();
        }
        catch(final AException ex)
        {
        }
        // compiler will not let you write a catch BException if the A interface
        // doesn't say that it is thrown.
    }
}

Что произойдет, если B:: foo бросил BException? Программа должна была выйти, поскольку для нее не было бы уловки. Чтобы избежать ситуаций, подобных этим дочерним классам, невозможно изменить типы исключений (кроме того, что они могут удалить исключения из списка).

Ответ 3

Вам нужно указать его на методах, которые могут вызывать исключения. Вы просто разделяете их на ",", если он может генерировать более одного типа исключения. например.

public interface MyInterface {
  public MyObject find(int x) throws MyExceptionA,MyExceptionB;
}