2016-11-28 7 views
37

Mam funkcję w następujący podpisDlaczego adnotacja @Nonnull została sprawdzona w czasie wykonywania?

public static String myFunction(@Nonnull String param) 

Kiedy ja nazywam go z param za nieważną, pojawia się następujący wyjątek:

Caused by: java.lang.IllegalArgumentException: Argument for @Nonnull parameter 'param' of com/MyClass.myFunction must not be null 
    at com.MyClass.$$$reportNull$$$0(MyClass.java) 

javax.annotation.Nonnull nie powinno być sprawdzane w czasie wykonywania .

Kto właściwie zgłasza wyjątek i dlaczego?

P.S. Uruchamiam serwer Tomcat w trybie debugowania z IntelliJ IDEA 2016.3 z Oracle JDK 1.8.0_102

+0

Właściwie @Jesper, te nowe adnotacje zostały stworzone do tego: sprawdź rzeczy podczas kompilacji. Możesz sprawdzić moją odpowiedź ... "Podczas kompilowania kodu, w tym modułu NonNull w wierszu poleceń, kompilator wypisze ostrzeżenie, jeśli wykryje potencjalny problem" – BrunoDM

+2

@BrunoDM - jest to wyjątek czasu wykonywania – Dmitry

Odpowiedz

58

Podczas kompilacji projektu w IntelliJ IDEA instrumentuje kod bajtowy skompilowanych klas w celu dodania sprawdzeń w czasie wykonywania dla różnych smaków adnotacji @Nonnull. To zachowanie jest kontrolowane przez opcję:

Ustawienia | Kompilacja, wykonanie, wdrożenie | Kompilator | [x] Dodaj asercje środowiska wykonawczego dla metod i parametrów o adnotacjach niewpisanych do wartości null.

+1

W jakiej wersji IDEA to funkcja została dodana? – Dmitry

+3

Ta funkcja została dodana ponownie w IntelliJ IDEA 5.0, ale w tym czasie wspierała tylko adnotacje JetBrains "@ NotNull". Obsługa innych adnotacji została ostatnio dodana. – yole

+28

Więc cudownie skompiluje kod inny niż łańcuch narzędzia budowania. To źle na tylu poziomach. Może to spowodować awarię testów jednostkowych po uruchomieniu z IntelliJ, ale na przykład przy uruchamianiu przez maven. Być może użytkownik ma zerową kontrolę i określony wyjątek, a testy jednostkowe sprawdzają poprawność tego wyjątku i komunikatu, ale wtedy przeszkadza to. –

Powiązane problemy