Я пытаюсь прояснить разницу между Throws в сигнатуре метода и Throw Statements в Java. Броски в сигнатуре метода следующие:
public void aMethod() throws IOException{
FileReader f = new FileReader("notExist.txt");
}
Заявления Throw выглядят следующим образом:
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;
}
Обновление ответа:
обновление 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;
}
обновление 2: для проверенного исключения. Нужно ли иметь в подписи "броски"? да.
// has to throw checked exception otherwise compile error
public String abc() throws IOException{
throw new IOException();
}
throw
не создает бросаемый объект; он просто выбрасывает уже созданный объект. Это ключевое словоnew
, которое создает объект. Думайте оthrow new MyException()
как оthrow (new MyException())
. Вы также можете иметьMyException e = new MyException(); throw e
. Увидеть разницу?throw
бросает,new
создает экземпляр. - person Bruno Reis   schedule 05.10.2013