Предположим, у меня есть следующий код:контракты против исключения
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)
или ...
сгенерирует исключение. Исключение может быть как описательным, как я хочу. Я также должен проверить конец функции, чтобы видеть, когда условия сообщения верны или нет.
Что бы вы использовали здесь и почему?
оптимальная идея: используйте обе! –
Если да, то да. Я не знаком с «кодовыми контрактами», как представлено выше. –
Не было смысла использовать оба варианта. Идея иметь кодовый контракт, в котором указано, что x> = 0, заключается в том, что мне не нужно проверять его снова в теле метода. Поэтому нет смысла использовать оба. –