0

要素が 1 つしかないリストを期待しているメソッドで例外をスローしたいのですが、リストに複数の要素がある場合は例外をスローしたいと思います。この場合にスローする適切な既存の Java 例外があるかどうかを判断しようとしています。ここでリストを目で見てみましたが、飛び出したものは何も見つかりませんでした。

この場合、メソッドがそのリストをオブジェクトの属性として参照していることを期待して、オブジェクトのメソッドを呼び出しています。したがって、実際には配列もインデックスも引数として渡していません。

(明確にするために編集)

4

5 に答える 5

4

与えられた入力が有効なものではないことをほのめかそうとしているのでIllegalArgumentException、同じ理由を示すメッセージとともに使用する必要があります。

throw new IllegalArgumentException("Input specified has more elements then expected");

またはException、条件を一意に定義する独自のものを作成することもできます。

例外の理由である要素の数以来、私はどういうわけか感じていますが、IndexOutOfBoundsExceptionこれは特定のシナリオで理にかなっています。

throw new IndexOutOfBoundsException("Expected size is 1, submitted input has size " + list.size());

編集:コメントによると

リストがメソッド呼び出しの一部ではなく、メソッドが呼び出されたオブジェクトに属していることを考えると、この場合list.size() > 1、オブジェクトが正しい状態にないことを意味し、適切なエラー メッセージを持つカスタマイズされたバージョンIllegalStateExceptionまたはIllegalStateExceptionそれ自体がより適切になります。

于 2012-05-21T17:29:48.023 に答える
3

独自の例外を作成してスローできます。

public MyException extends Exception {
}

if(list.size() > 1) {
    throw new MyException("Expected only 1 element, found: " + list.size());
}
于 2012-05-21T17:29:02.320 に答える
1

リストがメソッドを呼び出しているオブジェクトのフィールドである場合、間違ったサイズのリストを持つオブジェクトは間違った状態にあり、IllegalStateException適切であると言えます。

しかし実際には、このような状況が発生しないように、リストをスカラー フィールド ( become ) に置き換える必要がList<Foo>あります。Foo

于 2012-05-21T17:39:27.770 に答える
0

ユースケースを理解しているかどうかわからないので、この答えは根拠がないかもしれませんが、AssertionErrorをお勧めします

List < T > answers ; // expection a list of size one
assert 1 == list . size ( ) : "The programmer expects that there will be one and only one answer"
/*
In development:  assertions enabled,
 If there are zero answers, the program will crash on the assertion.
 If there are multiple answers, the program will crash on the assertion.
 Only if there is exactly one answer will it proceed to the below line (and work correctly).
In production:  assertions disbled,
 If there are zero answers, the program will throw a RuntimeException on the below line.
 If there are multiple answers, the program will proceed to the below line (and appear to work).
 If there is only one answer, the program will proceed to the below line and wok correctly.
*/
T answer = answers . get ( 0 ) ;

iforの使用に対するこのアプローチの利点switch

  1. 一部のコード カバレッジ ツールでは、分岐の単体テストを作成する必要があります。
  2. 分岐は循環的複雑性を増します。
  3. 評価は開発中にのみ実行されます
于 2012-05-21T17:56:29.930 に答える
0

このようなメソッドでエラーをスローできます

public void someMethod(List<MyClass> myList) throws NullPointerException, IllegalArgumentException {
    if (myList == null)
        throw new NullPointerException("myList parameter can't be null");
    if (myList.size() > 1) {
        throw new IllegalArgumentException("myList parameter must contain only 1 parameter");
    }
    //your code here...
}

プロパティ ファイルにエラー メッセージを設定すると、構成を変更して新しいメッセージを表示するだけでよく、コードを変更してエラー メッセージを書き直す必要はありません。

于 2012-05-21T17:31:05.170 に答える