gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:07:35 24 4
gpt4 key购买 nike

我正在研究单行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com