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

W sytuacjach takich jak powyższy, chciałbym umieścić na końcu końcówkę else, dzięki czemu mogę zostać powiadomiony, jeśli program uruchomi kod, który nie powinien działać, co oznacza, że ​​coś poszło nie tak (np. Jeden z powyższych warunków powinien być prawdą, ale nie ma, co oznacza, że ​​coś jest nie tak).Jaki wyjątek powinienem wyrzucić, gdy uruchamiany jest kod, który nie powinien być uruchamiany?

Jaki wyjątek powinienem podać w tym ostatnim przypadku, aby powiadomić mnie, że coś jest nie tak?

+0

Powodem, dla którego nie powinien dostać się do innego jest ważne, aby odpowiedzieć, wpływa semantyczny wyjątku zostać wyrzucony. – Dici

+4

Ogólnie rzecz biorąc, assertions są używane dla tego rodzaju rzeczy. AssertionError może być odpowiedni. – goat

+1

Myślę, że wyrzucenie wyjątku nie jest dobrym pomysłem. Lepszym rozwiązaniem byłoby zapobieżenie takiemu wprowadzeniu. Sugerowałbym również, czy jest to bezwzględnie konieczne, a następnie wyrzuć niestandardowy wyjątek, który będzie odpowiedni dla logiki biznesowej. – SamDJava

Odpowiedz

8

IllegalStateException jest dobrym kandydatem.

Jak stwierdza Java API:

Sygnały, że metoda została przywołana w nielegalnym lub niewłaściwym czasie. Innymi słowy, środowisko Java lub aplikacja Java nie są w odpowiednim stanie dla żądanej operacji.

Innymi słowy, twój program jest w stanie, dla którego nie zdefiniowano przejścia dla tego wejścia "to nie powinno być osiągnięte".

Jeśli Twój stuff, something i otherStuff są podobne do swoich argumentów metody, można również użyć IllegalArgumentException, jak:

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

Zawsze byłem pod wrażeniem, że IllegalStateException dotyczy sytuacji, w których wywoływanie metody w tym konkretnym czasie jest nielegalne, ale może być legalne. Więc IMO to naprawdę zależy od stopnia "to nie powinno się zdarzyć": czy to "nigdy" czy "czasami" – soulcheck

+0

@ Wyobrażenie, lubię myśleć o "IllegalStateException" jako sygnał do nieoczekiwanego wejścia dla bieżącego stanu programu (lub aktualny "czas", jak stwierdza stan Java API), biorąc pod uwagę program jako [automat stanów] (http://en.wikipedia.org/wiki/Finite-state_machine): wszystkie obiekty są stanem ** , a metody definiują automaty. – ericbn

+0

Tak, chociaż ta definicja czyni go tak szerokim, że można rzucić IllegalState na wszystko;) – soulcheck

3

Można stworzyć własną niestandardową klasę wyjątku poprzez rozszerzenie klasy wyjątku.

Na przykład:

class CustomException extends Exception { 
    ... 
} 

, a następnie:

if (stuff) 
    doThings(); 
else if (something) 
    doOtherThings(); 
else if (otherStuff) 
    doStuff(); 
else 
    throw new CustomException(); 
Powiązane problemy