JDK8中关于lambdas的bug| Java Debug 笔记

简介: 本期4ye又带来一个奇怪的Bug啦,是关于 jdk8 中 lambdas 推导泛型失败而导致的编译期错误,下面让我们一起来看看叭 😝Error:(24, 29) java: 未报告的异常错误java.lang.Throwable; 必须对其进行捕获或声明以便抛出下面让我们一起来看看叭场景模拟代码如下import java.util.Optional;public class B { public static void main(String[] args) { String s=null; Optional.ofNullable(s)


场景模拟


代码如下


import java.util.Optional;
public class B {
    public static void main(String[] args) {
        String s=null;
        Optional.ofNullable(s).orElseThrow(() -> {
            throw new RuntimeException("");
        });
    }
}
复制代码


运行


IDEA 运行的时候,会直接抛出该错误,编译不通过


网络异常,图片无法展示
|


网上搜索一番后,看到有人在说是编译器的原因,说 Eclipse 不会  (真的吗。。)


于是我半信半疑地手动编译试下,结果也不行。。


网络异常,图片无法展示
|


网络异常,图片无法展示
|


JDK8bug?


后面在 Stack Overflow 上发现这个


Throw RuntimeException inside Stream with Optional.orElseThrow


网络异常,图片无法展示
|


这个老哥说这个是 JDK 的 bug ,小伙伴们可以点击下面的连接去看看 😝


This is a compiler bug JDK-8047338 which prevent correct generic exception


type inference. It was partially resolved in 1.8.0_92 release


如下:


网络异常,图片无法展示
|


于是我看了下本地的 JDK 版本 ,都 271 了.. 也不行。


我索性将 JDK 切换成  11 的版本,结果正常编译运行起来了!


网络异常,图片无法展示
|


那么问题来啦,在不升级 JDK 的情况下,怎么保证代码的正常运行呢?


解决办法


从源码入手先~


下面是 OptionalorElseThrow源码


public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { 
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}
复制代码


可以发现这是一个泛型方法,那么根据错误信息提示,尝试着手动添加上这个泛型异常~


网络异常,图片无法展示
|


结果程序正常运行啦


网络异常,图片无法展示
|


这里4ye还找到一个大佬在说这个bug,详情请看zhuanlan.zhihu.com/p/111643471


还有来自 StackOverflow 的解答,


Java 8 generics + exceptions compile time error when using a lambda expression


可以发现这里的做法也是手动添加这个异常信息~


网络异常,图片无法展示
|


有兴趣的小伙伴们记得看一下~


完结,撒花✿✿ヽ(°▽°)ノ✿

网络异常,图片无法展示
|


泛型


最后简单复习下泛型的几种写法~ ,别忘了泛型的特点


泛型的特点:


  1. 编译擦除


  1. 类型安全


  1. 消除强制类型转换


泛型类


class Fruit<T> {}


泛型接口


interface IAnimal<T>{}


泛型变量


T a;


泛型方法


T getAnimal();


通配符


List<?>


泛型上下限原则:PECS(Producer Extends Consumer Super)


泛型上限


? extend T 属于 Producer Extends ,可以 获取值 ,但是不能修改值 。


如: List<? extend T> 就表明了只能调用 get 方法,不能使用 add 方法


泛型下限


? super T 属于 Consumer Super ,可以 修改值 ,但是不能获取值 。


如: List<? super T> 就表明了只能调用 add 方法,不能使用 get 方法


总结:


  1. JDK8 在使用 lambdas 推导泛型的类型时出错了 ,手动指定该类型即可解决问题!


  1. 可以通过升级 JDK 的版本来解决这个问题


  1. 如果你想更深入了解这个 lambda ,可以研究下


java.lang.invoke.LambdaMetafactory



目录
相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
7天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
12天前
|
Java API 开发者
【Java模块化新飞跃】JDK 22模块化增强:构建更灵活、更可维护的应用架构!
【9月更文挑战第9天】JDK 22的模块化增强为开发者构建更灵活、更可维护的应用架构提供了强有力的支持。通过模块化设计、精细的依赖管理和丰富的工具支持,开发者可以更加高效地开发和管理应用,提高应用的性能和可维护性。
45 10
|
14天前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
43 11
|
14天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
41 11
|
12天前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。
|
12天前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
14天前
|
Java API 数据处理
【Java的SIMD革命】JDK 22向量API:释放硬件潜能,让Java应用性能飙升!
【9月更文挑战第7天】 JDK 22向量API的发布标志着Java编程语言在SIMD技术领域的重大突破。这一新特性不仅释放了现代硬件的潜能,更让Java应用性能实现了飙升。我们有理由相信,在未来的发展中,Java将继续引领编程语言的潮流,为开发者们带来更加高效、更加强大的编程体验。让我们共同期待Java在SIMD技术的推动下开启一个全新的性能提升时代!
|
7天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
消息中间件 缓存 监控
29 0