Java 合同与例外

Java 合同与例外,java,exception,contracts,jml,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) {

假设我有以下代码:

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

抛出异常。异常可以是我想要的描述性的。我还希望在函数的末尾检查post条件是否为真


您会在这里使用哪一个?为什么?

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

如果是这样的话,那么检查异常就是一条出路


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

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

如果可以,可以。我不熟悉上面提到的“代码契约”,两者都用是没有意义的。让代码契约声明x>=0的想法是,我不必在方法体中再次检查它。因此,两者都使用是没有意义的。
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)