1

Junitを使用してJavaで例外を処理するのは初めてです。少しのガイダンスをいただければ幸いです。

私がやろうとしていること:

  • 新しい CustomObject の作成を で囲みます。これtryは、ユーザーがを呼び出すときに とString一致しない を渡すことができるためです。ここで例外をキャッチできるようにしたいのですが、「再スローするためだけに例外をキャッチする catch ステートメントは避けるべきです」と言われています。これを処理するためのより良い方法があるはずですか?enumvalueof()

  • 新しいオブジェクトが正しい場合enum、 を呼び出します。isValidObjectこれは を返しますbooleanIntegerが有効でない場合は例外throwです。

  • 私のテストには@Test(expected = AssertionError.class)と があります。

例外を使用するためのより良い/よりクリーンな方法はありますか?

私は以下のコードを持っています:

private CustomObject getObjectFromString(String objectDataString) {
        if (objectDataString != null) {
            String[] customObjectComponents = objectDataString.split(":");
            try {
                CustomObject singleObject = new CustomObject(EnumObjectType.valueOf(customObjectComponents [0]),
                        Integer.parseInt(customObjectComponents [1]));
                if (isValidCustomObject(singleObject)) {
                    return singleObject;
                } else {
                    throw new IllegalArgumentException("Unknown custom object type/value: " + EnumObjectType.valueOf(customObjectComponents [0]) + ":"
                            + Integer.parseInt(customObjectComponents [1]));
                }
            } catch (IllegalArgumentException e) {
                throw e;
            }

        }

ああ、誰かが例外処理について読むのに何か良いことをお勧めできるなら、それは素晴らしいことです.

4

1 に答える 1

5

例外をキャッチして再スローするだけのcatchステートメントは避ける必要があります。」。これを処理するためのより良い方法があるはずです。

はい、trycatchを削除するだけです。あなたのコードは以下と同等です:

private CustomObject getObjectFromString(String objectDataString) {
    if (objectDataString != null) {
        String[] customObjectComponents = objectDataString.split(":");
        CustomObject singleObject = new CustomObject(EnumObjectType.valueOf(customObjectComponents[0]),
                Integer.parseInt(customObjectComponents[1]));
        if (isValidCustomObject(singleObject)) {
            return singleObject;
        } else {
            throw new IllegalArgumentException("Unknown custom object type/value: " + EnumObjectType.valueOf(customObjectComponents[0]) + ":"
                    + Integer.parseInt(customObjectComponents[1]));
        }
    }
}

IllegalArgumentExceptionそのコードは、渡された値がenum.valueOf()有効でない場合、またはisValidCustomObjectメソッドがfalseを返した場合にをスローします。

文字列に、を呼び出す前にテストする可能性のあるIndexOutOfBoundExceptionが含まれていない場合にも、がスローされる可能性があることに注意してください。また、NumberFormatExceptionもスローされる可能性があります。:customObjectComponents[1]

そして、null文字列を有効なエントリとして受け入れるようですが、これはおそらく良い考えではありません(明らかにユースケースによって異なります)。

私はおそらくそれをそのように書いたでしょう:

private CustomObject getObjectFromString(String objectDataString) {
    Objects.requireNonNull(objectDataString, "objectDataString should not be null");
    String[] customObjectComponents = objectDataString.split(":");
    if (customObjectComponents.length != 2) {
        throw new IllegalArgumentException("Malformed string: " + objectDataString);
    }

    EnumObjectType type = EnumObjectType.valueOf(customObjectComponents[0]);
    try {
        int value = Integer.parseInt(customObjectComponents[1]);
    } catch (NumberFormatException e) {
        throw new IllegalArgumentException(customObjectComponents[1] + " is not an integer);
    }

    CustomObject singleObject = new CustomObject(type, value);
    if (isValidCustomObject(singleObject)) {
        return singleObject;
    } else {
        throw new IllegalArgumentException("Unknown custom object type/value: " + type + ":" + value);
    }
}

そして最後に、CustomObjectのコンストラクターが、別のisValidメソッドを呼び出す代わりに、引数がそれ自体でOKかどうかをチェックすることはおそらく理にかなっています。最後のブロックは単純に次のようになります。

    return new CustomObject(type, value);

必要に応じて、コンストラクターからIllegalArgumentExceptionがスローされます。

于 2012-11-14T22:21:38.487 に答える