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没有编译,但声明二编译正常.
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)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |