Jaki jest standardowy wyjątek do rzucania w Javie dla nieobsługiwanych / zaimplementowanych operacji?

308

W szczególności, czy Exceptionw takich okolicznościach stosowana jest standardowa podklasa?

Krishna Kumar
źródło
Czy właściwe jest użycie, gdy klasa nie implementuje metody, ale klasy potomne mogą to zrobić? Innymi słowy, mieć metodę abstrakcyjną w klasie nieabstrakcyjnej.
osa
@SergeyOrshanskiy Przydaje się, gdy w zależności od tego, jak zbudujesz obiekt, musisz utworzyć anonimową klasę, która implementuje interfejs w celu utworzenia instancji zmiennej członka, ale nie chcesz, aby była używana. Jeśli go ustawisz nulli przypadkowo użyjesz go (lub zrobił to ktoś inny), otrzymasz, NullPointerExceptionsco jest mniej oczywiste niż UnsupportedOperationExceptionsw tym przypadku. Tylko przykład.
2rs2ts

Odpowiedzi:

438

java.lang.UnsupportedOperationException

Wyrzucony, aby wskazać, że żądana operacja nie jest obsługiwana.

dfa
źródło
4
@JarrodRoberson OK, w takim przypadku taka instrukcja powinna zostać naprawdę usunięta z dokumentacji klasy. Wydaje się, że wyjątek jest używany przez inne pakiety. Myślę, że jeśli Oracle to zrobi, to powinniśmy. Złożę raport o błędzie.
Maarten Bodewes
1
Pamiętaj, że jest to niezaznaczone RuntimeException . W czasie kompilacji nie otrzymasz żadnej opinii ani pomocy w postępowaniu z tymi wyjątkami. Jeśli jest to używane w przypadku metody pośredniczącej lub w toku, powinieneś użyć pewnego rodzaju sprawdzonego wyjątku.
TastyWheat
221

Rozróżnij dwa wymienione przypadki:

  • Aby wskazać, że żądana operacja nie jest obsługiwana i najprawdopodobniej nigdy nie będzie, rzuć UnsupportedOperationException.

  • Aby wskazać, że żądana operacja nie została jeszcze zaimplementowana, wybierz jedną z następujących opcji:

    1. Użyj NotImplementedExceptionz Apache Commons-Lang , który był dostępny w świetlicy-LANG2 stał i został ponownie dodany do świetlicy-lang3 w wersji 3.2.

    2. Zrealizuj własne NotImplementedException.

    3. Rzuć UnsupportedOperationExceptionz komunikatem typu „Jeszcze nie zaimplementowano”.

steffen
źródło
1
Idę z tym, ponieważ wydaje mi się to rozsądne. „Jeszcze” lub „nigdy” wskazane przez wyjątek daje wyobrażenie o tym, jak na to zareagować.
sschrass
3
# 1 lub 2 są w praktyce znacznie lepsze. # 3 przechwytuje semantyczne rozróżnienie między „nieobsługiwany” a „nie zaimplementowany”, ale posiadanie osobnej klasy ułatwia szybkie wyszukiwanie w celu sprawdzenia, czy nie zapomniałeś zaimplementować czegokolwiek, co powinieneś zrobić.
Sean U
4
# 3 jest najlepszy dla niezaimplementowanych metod, ponieważ nie wymaga biblioteki innej firmy ani dodatkowej pracy, nawet jeśli jest to commons-lang.
JoshDM
28

Jeśli utworzysz nową (jeszcze nie zaimplementowaną) funkcję w NetBeans , wygeneruje ona treść metody z następującą instrukcją:

throw new java.lang.UnsupportedOperationException("Not supported yet.");

Dlatego zalecam użycie wyjątku UnsupportedOperationException .

Benny Neugebauer
źródło
14

Jeśli chcesz uzyskać większą szczegółowość i lepszą opis, możesz użyć NotImplementedException od commons-lang

Ostrzeżenie: Dostępne tylko przed wersją 2.6 i po wersji 3.2.

Guillaume
źródło