メソッドシグネチャのスローとJavaのスローステートメントの違いを明確にしようとしています。メソッドシグネチャのスローは次のとおりです。
public void aMethod() throws IOException{
FileReader f = new FileReader("notExist.txt");
}
スローステートメントは次のとおりです。
public void bMethod() {
throw new IOException();
}
私の理解ではthrows
、メソッド署名は、メソッドがそのような例外をスローする可能性があるという通知です。throw
ステートメントは、状況に応じて作成されたオブジェクトを実際にスローするものです。その意味で、メソッド内にthrowステートメントが存在する場合、メソッド シグネチャ内の throw は常に表示される必要があります。
ただし、次のコードはそうしていないようです。コードはライブラリからのものです。私の質問は、なぜそれが起こっているのですか?概念を間違って理解していますか?
このコードは、java.util.linkedList からのコピーです。@著者 ジョシュ・ブロック
/**
* 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();
}