Инвариантное исключение Java

У меня есть проект, в котором некоторые данные имеют инварианты, которые невозможно применить с помощью языковых конструкций, но я намеревался написать свой код таким образом, чтобы они сохранялись. Если они по какой-то причине сломаны, значит мой код глючит. У меня есть некоторый код проверки работоспособности, который может обнаружить, были ли нарушены эти инварианты, но я не уверен, каков канонический подход Java к реагированию на такое условие - есть ли какое-то стандартное исключение, которое я должен бросить? Использовать утверждение?

Обратите внимание, что это проблема неправильной установки значения в какой-то момент. Сама ошибка возникает не во время проверки работоспособности, а в прошлом, и проверка работоспособности только сейчас ее обнаруживает (т.е. не плохо, что сама проверка работоспособности запущена, плохо, что проверка не удалась).

Спасибо!


person joshlf    schedule 03.07.2013    source источник


Ответы (2)


Бросьте IllegalStateException. Он предназначен специально для таких целей.

person Jashaszun    schedule 03.07.2013
comment
Я нахожу много разных реализаций от разных компаний - можете ли вы предоставить ссылку? Спасибо. - person joshlf; 04.07.2013
comment
@Jashaszun Вы имели в виду IllegalStateException? - person Jeffrey; 04.07.2013
comment
@Джеффри, извини, да. Именно это я хотел сказать. - person Jashaszun; 04.07.2013
comment
Я не уверен, что определение IllegalStateException очень хорошо подходит для инвариантной проблемы: method has been invoked at an illegal or inappropriate time. - person Paolo Fulgoni; 30.05.2014

Решение о том, как ваше приложение будет реагировать на сломанный инвариант, было бы разумным первым шагом.

В случае, если сломанный инвариант неисправим и в основном означает ошибку кода, я второй ответ о IllegalStateException.html (вы можете добавить полезный контекст для целей отладки, например, переменные в сломанном инварианте) - такое непроверенное исключение остановит работающий поток

В случае, если вы можете восстановить сломанный инвариант (заменив некоторые аргументы разумным значением по умолчанию, предприняв вторую попытку) - вы можете создать проверенное исключение и поймать его на одном из верхних уровней и выполнить план B.

person diy    schedule 03.07.2013
comment
Эй, я только что немного уточнил свой вопрос в ответ на ваш ответ (который, учитывая то, что я написал ранее, был совершенно разумным и остается таковым). Согласно документации: Сигналы о том, что метод был вызван в недопустимое или неподходящее время. Это не совсем правильно, поскольку дело не в том, что эта переменная не должна иметь это значение прямо /сейчас/, а в том, что она должна /никогда/ иметь это значение. Тем не менее, это действительно близко. Это почти правильно, просто не совсем. - person joshlf; 04.07.2013
comment
Хорошо. Почему бы вам не попробовать следующее: Разделите вычисление на последовательность логических методов. Каждый метод будет использовать данные из предыдущих шагов, но сначала выполнит проверки и выдаст исключение IllegalArgumentException, если проверка не пройдена. Конструкторы для начального набора значения должны сделать то же самое, чтобы проверить, что они получили правильные входные параметры. Таким образом, вы будете уверены, что на каждом шаге у вас будут правильные входные данные. - person diy; 04.07.2013
comment
В данном конкретном контексте это не сработает, но мне нравится эта идея в теории. В любом случае, я думаю, что выберу IllegalStateException, потому что это самое близкое из того, что я нашел. - person joshlf; 08.07.2013