合同与例外

时间:2010-03-18 20:49:54

标签: java exception contracts jml

我们假设我有以下代码:

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运行并且&lt; 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)

...或

抛出异常。例外可以像我想要的那样描述。我还要检查函数的结尾,以查看发布条件是否为真。

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

2 个答案:

答案 0 :(得分:2)

我喜欢代码合同的想法,但描述性的IllegalArgumentException(或类似的)为我提示。获取显式异常消息的支持/生产角色(甚至是开发)更加清晰,这使您可以在诊断中出现问题(系统是否已损坏,或者您是否在开发过程中滥用API) )。

答案 1 :(得分:1)

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

如果是这样,检查异常是可行的方法。

如果你无法从这种情况中恢复,那么无论如何都要使它成为合同并大声失败 - 但在任何一种情况下我都会使用描述性的错误信息。