Я пытаюсь очистить разницу между Throws в сигнатуре метода и Throw Statement в Java. Выдает подпись метода следующим образом:
public void aMethod() throws IOException{
FileReader f = new FileReader("notExist.txt");
}
Throw Statement выглядит следующим образом:
public void bMethod() {
throw new IOException();
}
По моему мнению, throws
в сигнатуре метода является уведомлением о том, что метод может вызывать такое исключение. throw
- это то, что на самом деле бросает созданный объект в соответствии с обстоятельствами.
В этом смысле throws в сигнатуре метода должен всегда отображаться, если в методе существует оператор throw.
Однако следующий код, похоже, не делает этого. Код из библиотеки. Мой вопрос, почему это происходит? Я понимаю понятия неправильно?
Этот фрагмент кода является копией из java.util.linkedList. @author Джош Блох
/**
* Returns the first element in this list.
*
* @return the first element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
Обновление ответа:
update 1: находится выше кода так же, как и следующее:
// as far as I know, it is the same as without throws
public E getFirst() throws NoSuchElementException {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
update 2: для проверенного исключения. Нужно ли иметь "броски" в подписи? Да.
// has to throw checked exception otherwise compile error
public String abc() throws IOException{
throw new IOException();
}