1

Javaのベストプラクティスについて質問があります。私は、構築時にオブジェクトにかなり大きく依存するクラスを作成しています。実際、構築時に渡されたオブジェクトがnullの場合、ほとんどの機能は意味をなしません。オブジェクト構築時に引数としてnullが渡された場合に例外をスローするのが最善だと思いましたが、この場合に最も適切な例外が何であるかはわかりません。NullPointer、IllegalArgument、Instatiation、またはInitialization例外をスローする必要があります。

これらはすべてJavaソースコードベース全体で使用されているのを見てきましたが、NullPointerが使用された理由とIllegalArgumentが使用された理由を区別できないようです。個人的には、構築時に悪い引数が渡されると、初期化エラーが発生するはずだと思っていました。

4

4 に答える 4

5

まず、絶対に例外をスローする必要があります。それは単に正しいことです。

投げるべきか、投げるべきかIllegalArgumentExceptionについてNullPointerExceptionは、Josh Bloch が『Effective Java』でこれについて述べており、一般的にはそれNullPointerExceptionが妥当な選択であると結論付けています。同意するかどうかは完全にはわかりませんが (おそらく を選択していただろうIllegalArgumentException)、最終的には問題になることはほとんどありません。これらの例外のいずれかを直接キャッチするべきではありません。いずれにせよ、スタック トレースはどこに問題があるかを示します。

(Java に .NET の に相当するものがないのは残念ですArgumentNullException。これは、まさにそのように聞こえることを意味します。)

Preconditions個人的には、Guava のクラスの大ファンです。

public class Foo {
  private final Bar bar;

  public Foo(Bar bar) {
    this.bar = Preconditions.checkNotNull(bar);
  }
}

( の静的インポートで使用されることもありcheckNotNullます。)

于 2012-06-22T16:47:36.763 に答える
4

IllegalArgument は、コードを使用した開発者に、何が問題で、どのように修正すればよいかを明確にします。また、メソッドがそのオブジェクトなしでは機能しないことも明確になります。

NullPointer は、問題が何であるかについて少し考える必要があることを意味し (それほど多くはありません)、コードがよりクリーンであることを意味する場合もありますが、上で述べたように。ドキュメントの観点からは、コードが null 値を処理できるかどうかはすぐにはわかりません。

于 2012-06-22T16:50:50.770 に答える
1

NullPointerExceptionnull有効なオブジェクトを期待しているが、代わりに取得する場合に使用されます。nullこれは、オブジェクトのメソッドを呼び出そうとする場合に特に重要です。これは最も一般的な使用方法です。ただし、あなたのケースもそれを保証する場合があります。

IllegalArgumentException予期しない、または間違ったタイプ/スタイル/などの引数をメソッドに受け取ったときに使用されます。私の見解では、これはあなたの場合により適切です。有効なオブジェクトが必要ですがnull、引数として受け取りました。この引数の値は無効です。そのため、スローIllegalArgumentExceptionして、例外のメッセージで何が問題なのかを指定します。たとえば、次のようになります。

public MyClass(InputObject obj) {
    if(obj == null) {
        throw new IllegalArgumentException("null passed to MyClass constructor");
    }

    ...
}
于 2012-06-22T16:49:24.767 に答える
1

プラットフォームの例外が、問題を理解して修正するための適切な量の情報をクライアントに提供しないと思われる場合は、.NET のような、その点でより適切な独自の例外を作成できますArgumentNullExceptionこれにより、問題の内容修正方法の両方がクライアントに伝えられます。

于 2012-06-22T22:45:26.153 に答える