Korzystanie z asercji Java

1. Wstęp

Słowo kluczowe Java assert pozwala programistom szybko zweryfikować pewne założenia lub stan programu.

W tym artykule przyjrzymy się, jak używać słowa kluczowego assert w języku Java .

2. Historia asercji Java

Słowo kluczowe Java assert zostało wprowadzone w Javie 1.4, więc istnieje od dłuższego czasu. Jednak pozostaje mało znanym słowem kluczowym, które może radykalnie zmniejszyć szablon i uczynić nasz kod bardziej czytelnym.

Na przykład, często w naszym kodzie musimy zweryfikować pewne warunki, które mogą uniemożliwić prawidłowe działanie naszej aplikacji. Zazwyczaj napisalibyśmy coś takiego:

Connection conn = getConnection(); if(conn == null) { throw new RuntimeException("Connection is null"); }

Za pomocą asercji możemy usunąć instrukcję if i throw za pomocą jednej instrukcji assert .

3. Włączanie asercji Java

Ponieważ asercje Java używają słowa kluczowego assert , nie są potrzebne żadne biblioteki ani pakiety do zaimportowania.

Zauważ, że przed wersją Java 1.4 było całkowicie legalne używanie słowa „assert” do nazewnictwa zmiennych, metod itp. Potencjalnie prowadzi to do konfliktu nazewnictwa przy używaniu starszego kodu z nowszymi wersjami JVM.

Dlatego w celu zapewnienia zgodności z poprzednimi wersjami maszyna JVM domyślnie wyłącza sprawdzanie poprawności potwierdzenia . Muszą być jawnie włączone za pomocą argumentu wiersza poleceń -enableassertions lub jego skrótu -ea:

java -ea com.baeldung.assertion.Assertion

W tym przykładzie włączyliśmy asercje dla wszystkich klas.

Możemy również włączyć asercje dla określonych pakietów i klas:

java -ea:com.baeldung.assertion... com.baeldung.assertion.Assertion

Tutaj włączyliśmy asercje dla wszystkich klas w pakiecie com.baeldung.assertion .

Podobnie można je wyłączyć dla określonych pakietów i klas za pomocą argumentu wiersza poleceń -disableassertions lub jego skrótu -da . Możemy również użyć wszystkich czterech z tych argumentów razem.

4. Korzystanie z asercji Java

Aby dodać asercje, po prostu użyj słowa kluczowego assert i nadaj mu warunek logiczny :

public void setup() { Connection conn = getConnection(); assert conn != null; }

Java udostępnia również drugą składnię dla asercji, które pobierają ciąg znaków, który zostanie użyty do skonstruowania AssertionError, jeśli zostanie rzucony:

public void setup() { Connection conn = getConnection(); assert conn != null : "Connection is null"; }

W obu przypadkach kod sprawdza, czy połączenie z zasobem zewnętrznym zwraca wartość różną od null. Jeśli ta wartość ma wartość null, maszyna JVM automatycznie zgłosi błąd AssertionError .

W drugim przypadku wyjątek będzie zawierał dodatkowe szczegóły, które pojawią się w śladzie stosu i mogą pomóc w debugowaniu problemu.

Rzućmy okiem na wynik działania naszej klasy z włączonymi asercjami:

Exception in thread "main" java.lang.AssertionError: Connection is null at com.baeldung.assertion.Assertion.setup(Assertion.java:15) at com.baeldung.assertion.Assertion.main(Assertion.java:10)

5. Obsługa błędu AssertionError

Klasa AssertionError rozszerza Error , który sam rozszerza Throwable . Oznacza to, że AssertionError jest niezaznaczonym wyjątkiem.

Dlatego metody, które używają asercji, nie muszą ich deklarować, a dalsze wywoływanie kodu nie powinno próbować ich przechwytywać.

AssertionErrors mają na celu wskazanie niemożliwych do odzyskania warunków w aplikacji, więc nigdy nie próbuj ich obsługiwać ani próbować odzyskać.

6. Najlepsze praktyki

Najważniejszą rzeczą do zapamiętania w przypadku asercji jest to, że można je wyłączyć, więc nigdy nie zakładaj, że zostaną wykonane .

Dlatego podczas korzystania z asercji pamiętaj o następujących rzeczach:

  • Zawsze sprawdzaj wartości null i puste opcje opcjonalne, jeśli to konieczne
  • Unikaj używania asercji do sprawdzania danych wejściowych w metodzie publicznej i zamiast tego użyj niezaznaczonego wyjątku, takiego jak IllegalArgumentException lub NullPointerException
  • Nie wywołuj metod w warunkach asercji i zamiast tego przypisz wynik metody do zmiennej lokalnej i użyj tej zmiennej z assert
  • Asercje są świetne dla miejsc w kodzie, które nigdy nie zostaną wykonane, na przykład domyślny przypadek instrukcji switch lub po pętli, która nigdy się nie kończy

7. Wnioski

Słowo kluczowe assert w Javie jest dostępne od wielu lat, ale pozostaje mało znaną cechą języka. Może pomóc usunąć wiele gotowego kodu, uczynić kod bardziej czytelnym i pomóc zidentyfikować błędy na wczesnym etapie rozwoju programu.

Pamiętaj tylko, że asercje nie są domyślnie włączone, więc nigdy nie zakładaj, że zostaną wykonane, gdy zostaną użyte w kodzie.

Jak zawsze, pełny kod źródłowy jest dostępny na GitHub.