Вопрос по exception-handling, java, interface – обработка исключений в реализованном методе

0

Код ниже дает проверенную ошибкуthrows Exception:

import java.io.IOException;

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws Exception {}
// ...
}

в то время как приведенный ниже компилируется нормально:

import java.io.IOException;

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws NullPointerException {}
// ...
}

По какой логике это делает Java - есть идеи?

ТИА.

NullPointerException не является проверенным исключением. user207421

Ваш Ответ

1   ответ
1

throws Ключевое слово указывает, что метод или конструкторМожно бросить исключение, хотя это не обязательно.

Давайте начнем с вашего второго фрагмента

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws NullPointerException {}
}

Рассматривать

some ref = getSome();
try {
    ref.ss99();
} catch (IOException e) {
    // handle
}

Все, с чем вам нужно работать - это с вашим интерфейсомsome, Мы (компилятор) не знаем фактическую реализацию объекта, на который он ссылается. Таким образом, мы должны убедиться, чтоIOException тотможет быть брошенным.

В случае

SQL2 ref = new SQL2();
ref.ss99();

вы работаете с фактической реализацией. Эта реализация гарантирует, что она никогда не броситIOException (не объявляя это). Поэтому вам не нужно иметь с этим дело. Вам также не нужно иметь дело сNullPointerException потому что это непроверенное исключение.

Что касается вашего первого фрагмента, немного изменился

interface some {
    void ss99() throws IOException;
}

public class SQL2 implements some {
    @Override
    public void ss99 () throws Exception { throw new SQLException(); }
}

Рассматривать

some ref = new SQL2();
try {
    ref.ss99();
} catch (IOException e) {
    // handle
}

Таким образом, хотя вы обрабатываете исключение, объявленное в интерфейсе, вы бы разрешили проверенное исключение,SQLExceptionубежать необработанным. Компилятор не может этого допустить.

Переопределенный метод должен быть объявлен так, чтобы выдавать то же исключение (как родительский) или один из его подклассов.

Похожие вопросы