Создание нескольких исключений в методе интерфейса в Java - PullRequest
15 голосов
/ 30 января 2010

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

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

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

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

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: вставить (int) в assign.SortedArray не может реализовать вставить (int) в assign.dictionary; переопределенный метод не выбрасывает assign.SortedArray.Duplicate_Element_FoundException public пустые вставки (int x) Dictionary_FullException

Ответы [ 3 ]

26 голосов
/ 30 января 2010

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

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;
}
4 голосов
/ 30 января 2010

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

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 бросил исключение BEx? Программа должна была выйти, так как не было никакой выгоды для нее. Чтобы избежать подобных ситуаций, дочерние классы не могут изменять типы создаваемых исключений (за исключением того, что они могут удалять исключения из списка).

2 голосов
/ 30 января 2010

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

public interface MyInterface {
  public MyObject find(int x) throws MyExceptionA,MyExceptionB;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...