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;
    }
}

我可以在这里做两件事:

使用代码合同(在这种情况下,注释中的内容)。当 sumNumbers 运行并且 a < 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)

或者...

抛出异常。异常可以像我想要的那样具有描述性。我还要检查函数的末尾,看看后置条件是否为真。

你会在这里使用哪个,为什么?

4

2 回答 2

3

我喜欢代码契约的想法,但描述性IllegalArgumentException(或类似的)提示我。在支持/生产角色(甚至开发人员)中获得明确的异常消息要清楚得多,这可以让您在诊断出了什么问题(系统是否损坏,或者您在开发过程中是否滥用 API)方面处于领先地位)。

于 2010-03-18T20:55:21.343 回答
1

您是否期望在程序正常运行期间可能会将无效输入传递给该参数?如果是,你能从中恢复吗?

如果是这样,检查异常是要走的路。

如果你不能从这种情况中恢复过来,那么一定要让它成为一个合同并大声失败——但在任何一种情况下,我都会使用描述性错误消息。

于 2010-03-18T20:53:42.947 回答