我正在研究单行 lambda 和运行时异常。
我已经测试了以下用例并发现了声明 1
未编译 where as 语句 2
编译正常。
new Thread(() -> throw new RuntimeException("test")); // 1
new Thread(() -> new RuntimeException("test")); //2
请帮助我理解为什么语句 1 无法编译,但语句 2 编译正常。
最佳答案
lambda 表达式定义(在 JLS 15.27. Lambda Expressions 中)为:
LambdaExpression:
LambdaParameters -> LambdaBody
LambdaBody 定义为:
LambdaBody:
Expression
Block
在两个 lambda 表达式中,您都不使用 block 作为 lambda 主体(这需要大括号),这意味着您必须使用表达式。
表达式定义为:
Expressions can be broadly categorized into one of the following syntactic forms:
Expression names (§6.5.6)
Primary expressions (§15.8 - §15.13)
Unary operator expressions (§15.14 - §15.16)
Binary operator expressions (§15.17 - §15.24, and §15.26)
Ternary operator expressions (§15.25)
Lambda expressions (§15.27)
new RuntimeException("test")
属于“主表达式”类别,其中包括对象创建(创建的对象是一个 Exception
的事实使得没有不同)。因此它是一个有效的 lambda 主体。
另一方面,throw new RuntimeException("test")
不属于任何这些类别,因此不是表达式。
为了让 lambda 正文包含该语句,您必须使用 Block LambdaBody:
new Thread(() -> {throw new RuntimeException("test");});
关于java - 单行 Lambda 和运行时异常 - 未编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625883/