2014-09-14 3 views
5
if (stuff) doThings(); 
else if (something) doOtherThings(); 
else if (otherStuff) doStuff(); 
else // .. this isn't supposed to be reached 

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

Какое исключение я должен делать в этом финале, чтобы уведомить меня, что-то не так?

+0

Причина, почему он не должен попасть в еще важно, чтобы ответить вам, это влияет на семантику исключения быть выброшен. – Dici

+4

В общем, утверждения используются для этого рода вещей. AssertionError может быть подходящим. – goat

+1

Я думаю, что исключение - это не очень хорошая идея. Лучшим подходом было бы предотвратить такой ввод. Кроме того, я бы предложил, если это абсолютно необходимо, то бросьте настраиваемое исключение, которое будет подходящим для бизнес-логики. – SamDJava

ответ

8

IllegalStateException является хорошим кандидатом.

Как утверждает API Java:

сигналы о том, что метод был вызван в незаконной или неподходящее время. Другими словами, среда Java или приложение Java не находятся в соответствующем состоянии для запрошенной операции.

Другими словами, ваш program находится в состоянии, для которого нет перехода, определенного для этого входа «Это не должно быть достигнуто».

Если ваш stuff, something и otherStuff все связаны с вашими аргументами метода, вы можете также использовать IllegalArgumentException, как:

if (arg == null) doThings(); 
else if (arg.endsWith("foo")) doOtherThings(); 
else if (arg.endsWith("bar")) doStuff(); 
else throw new IllegalArgumentException(
     "arg should be null or end with \"foo\" or \"bar\""); 
+0

Мне всегда казалось, что IllegalStateException для ситуаций, когда вызов метода в это конкретное время является незаконным, но может быть законным в целом. Так что ИМО действительно зависит от уровня «этого не должно быть»: «никогда» или «иногда» – soulcheck

+0

@soulcheck, мне нравится думать о 'IllegalStateException' как о сигнале на неожиданный ввод для текущего состояния программы (или текущее «время», как указано в Java API), рассматривая программу как [конечный автомат] (http://en.wikipedia.org/wiki/Finite-state_machine): все объекты являются ** состоянием ** , и методы определяют автоматизацию. – ericbn

+0

Да, хотя это определение делает его настолько широким, что можно набросить IllegalState для всего:) – soulcheck

3

Вы можете создать свой собственный пользовательский класс исключений, расширив класс Exception.

Например:

class CustomException extends Exception { 
    ... 
} 

И потом:

if (stuff) 
    doThings(); 
else if (something) 
    doOtherThings(); 
else if (otherStuff) 
    doStuff(); 
else 
    throw new CustomException(); 
Смежные вопросы