Вопрос

Предположим, у меня есть следующий код:

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)

или...

Выбросить исключение.Исключение может быть настолько описательным, насколько я хочу.Я также хотел бы проверить конец функции, чтобы узнать, верны или нет условия публикации.

Что бы вы здесь использовали и почему?

Это было полезно?

Решение

Мне нравится идея контрактов кода, но описательные IllegalArgumentException (или что-то подобное) дает мне совет.В роли поддержки/производства (или даже разработки) гораздо понятнее получить явное сообщение об исключении, которое дает вам преимущество в диагностике того, что идет не так (не работает ли система или вы неправильно используете API во время разработки). ).

Другие советы

Ожидаете ли вы, что в этот аргумент могут быть переданы недопустимые входные данные во время нормальной работы вашей программы?Если да, можете ли вы оправиться от этого?

Если да, то проверенные исключения — это то, что вам нужно.

Если вы не можете оправиться от такого рода случая, то непременно заключите контракт и громко потерпите неудачу - но в любом случае я бы использовал описательное сообщение об ошибке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top