单行Lambda和运行时异常 - 不编译?

Jok*_*ker 2 java lambda runtimeexception

我正在研究单行lambda和运行时异常.

我已经测试了以下用例,并且发现语句1没有编译语句2编译正常的地方.

 new Thread(() -> throw new RuntimeException("test")); // 1
 new Thread(() -> new RuntimeException("test")); //2
Run Code Online (Sandbox Code Playgroud)

请帮助我理解为什么声明1没有编译,但声明二编译正常.

Era*_*ran 6

lambda表达式定义为(在JLS 15.27.Lambda表达式中):

LambdaExpression:
LambdaParameters - > LambdaBody

LambdaBody定义为:

LambdaBody:
表达式

在两个lambda表达式中,不使用块作为lambda体(需要花括号),这意味着您必须使用Expression.

表达式定义为:

表达式可以大致分为以下句法形式之一:

  • 表达名称(§6.5.6)

  • 主要表达(§15.8 - §15.13)

  • 一元运算符表达式(§15.14 - §15.16)

  • 二元运算符表达式(§15.17 - §15.24和§15.26)

  • 三元运算符表达式(§15.25)

  • Lambda表达式(§15.27)

new RuntimeException("test")属于"主要表达式"的类别,其中包括对象创建(正在创建的对象Exception没有区别这一事实).因此它是一个有效的lambda体.

另一方面,throw new RuntimeException("test")不属于任何这些类别,因此不是表达.

为了使lambda主体包含该语句,您必须使用Block LambdaBody:

new Thread(() -> {throw new RuntimeException("test");});
Run Code Online (Sandbox Code Playgroud)

  • 可能需要指出throw和return之间的相似之处:出于相同的原因,您也不能在电子邮件lambda正文中返回。 (2认同)