2017-01-31 40 views
5

Rozumiem, że lambda w języku Java nie może przesłać sprawdzonego wyjątku, ale może rzucić wyjątek RuntimeException, ale dlaczego poniższy kod wymaga nawiasów?Dlaczego Lambda Java, która zgłasza wyjątek Runtime, wymaga nawiasów?

Map<String, Integer> m = new HashMap<>(); 
Integer integer = m.computeIfAbsent("", s -> {throw new IllegalArgumentException("fail");}); 

Dlaczego nie możesz?

m.computeIfAbsent("", s -> throw new IllegalArgumentException("fail")); 

Czy to ze względu na założeniu kompilatora, że ​​powróci w tym przypadku int, więc do nich nie może mieć zwrot wyjątek, choć jego wyrzucony?

+4

Zasadniczo, formularz 's-> expr' działa tylko dla wyrażeń. 'throw' jest stwierdzeniem. – ZhongYu

+0

ah, to ma sens, jeśli umieścisz to w odpowiedzi, umieści to jako zaznaczoną odpowiedź – Ash

+2

Możesz także przeczytać [to] (http://stackoverflow.com/q/41482574/2711488) i [to] (http://stackoverflow.com/q/24146285/2711488)... – Holger

Odpowiedz

6

język Java Specyfikacja describes the body of a lambda expression

Korpus lambda albo pojedynczym ekspresji lub blok (§14.2).

To jednak

throw new IllegalArgumentException("fail") 

jest throwstatement, a nie wyrazem. Dlatego kompilator odrzuca go jako ciało wyrażenia lambda.

Możesz przejść przez króliczą dziurę i dowiedzieć się, jakie są wszystkie rodzaje wyrażeń, here (postępuj zgodnie z gramatyką).

+0

+1. Myląco, kiedy umieścisz nieskrępowaną instrukcję 'throw' w lambda,' javac' daje błąd 'nielegalne rozpoczęcie wyrażenia' w 'throw'. –

Powiązane problemy