2

次のコードがあるとします。

public class MainClass {
    public static void main(String[] args) {
        System.out.println(sumNumbers(10, 10));
    }

    //@requires a >= 10;
    //@ensures \result < 0;
    public static int sumNumbers(int a, int b) {
        return a+b;
    }
}

私はここで2つのことをすることができます:

コード コントラクトを使用します (この場合、コメントの内容)。sumNumbers が実行されて 10 未満の場合、すぐに例外がスローされます (あまり説明的ではないようですが)。

Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
    at MainClass.sumNumbers(MainClass.java:500)
    at MainClass.internal$main(MainClass.java:9)
    at MainClass.main(MainClass.java:286)

また...

例外をスローします。例外は、必要に応じて説明することができます。また、関数の最後をチェックインして、事後条件が true かどうかを確認します。

ここではどちらを使用しますか?なぜですか?

4

2 に答える 2

3

コード コントラクトのアイデアは気に入っていますが、説明的なIllegalArgumentException(または同様の) ヒントが役立ちます。サポート/生産の役割 (または開発) では、明示的な例外メッセージを取得する方がはるかに明確です。これにより、何が問題なのか (システムが壊れているのか、開発中に API を誤用しているかどうか) を診断するのに有利なスタートを切ることができます。 )。

于 2010-03-18T20:55:21.343 に答える
1

プログラムの通常の操作中に、無効な入力がこの引数に渡される可能性があると思いますか? もしそうなら、あなたはそれから回復できますか?

もしそうなら、チェックされた例外が行く方法です。

この種のケースから回復できない場合は、必ずそれをコントラクトにして大声で失敗しますが、いずれの場合も説明的なエラー メッセージを使用します。

于 2010-03-18T20:53:42.947 に答える