Mechanizm assert pojawił się w Javie 1.4 i jest przeznaczony do sprawdzania inwariantów i stanów wewnątrz kodu podczas opracowywania i debugowania. Assert pomaga w wykrywaniu błędów wczesnych etapów podczas testowania, ale należy go stosować ostrożnie i nie może zastąpić obsługi błędów w produkcji.
Historia zagadnienia:
W niektórych językach konstrukcje assert były dostępne od dawna, w Javie pojawiły się stosunkowo późno. Głównym celem jest wygoda diagnozowania logiki podczas opracowywania i testowania.
Problem:
Niewłaściwe użycie assert może prowadzić do tego, że ważne kontrole znikną (jeżeli assert jest wyłączony), lub do nieoczekiwanych błędów w produkcji, jeżeli spróbuje się użyć assert jako obsługi oczekiwanych błędów.
Rozwiązanie:
Assert używa się tylko do sprawdzania warunków, które nie powinny nigdy zostać naruszone (np. inwariantów, warunków wstępnych, warunków końcowych), a nie do walidacji danych wejściowych użytkownika. W produkcji assert jest zazwyczaj wyłączony domyślnie (JVM uruchamia się z -ea/-enableassertions, aby włączyć assert).
Przykład użycia:
public void process(int value) { assert value > 0 : "Wartość musi być dodatnia"; // ... }
Kluczowe cechy:
Jaki błąd wystąpi, jeśli warunek assert jest fałszywy, a assert jest włączony?
Zostanie zgłoszony java.lang.AssertionError. Program może zakończyć się awaryjnie, jeśli błąd nie zostanie przechwycony.
Czy asserty zawsze są wykonywane?
Nie. Działają tylko przy uruchomieniu JVM z flagą -ea. Domyślnie (w produkcji) nie są wykonywane.
Czy można używać assert do sprawdzania danych wejściowych użytkownika?
Nie można! Do sprawdzania danych wejściowych należy używać obsługi wyjątków i walidacji, ponieważ assert może być wyłączony, a więc kontrole nie zostaną wykonane.
Programista sprawdza ważność parametru użytkownika za pomocą assert, a produkcja uruchamia się bez -ea. Kontrola nie działa, błąd pojawia się dopiero w dalszej logice, powodując skomplikowane błędy.
Zalety:
Wady:
Programista używa assert tylko do wewnętrznej kontroli inwariantów podczas opracowania. Dla błędów użytkowników — wyjątki i standardowa walidacja.
Zalety:
Wady: