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

标签 java lambda runtimeexception

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

相关文章:

java - 您如何在 spring-security 中注销所有已登录的用户?

java - 迭代器 next 方法

java - 使用浏览器上传大文件而不会挂起(最好使用 Flash)

lambda - TypeScript:Lambdas 和使用 'this'

java - 了解 Java 中的检查异常与非检查异常

java - Spring MVC 和 Hibernate : How to print out left joined fields?

javascript - 使用 javascript 使用排序函数而不使用 lambda 函数

java - 更改两种类型参数边界的顺序会导致 Java 运行时错误

java - 方法覆盖和继承与异常

android - Process.getExclusiveCores() 在某些设备上抛出异常