java8: 因为lambda表达写法造成的编译错误: java.lang.AssertionError: isSubClas

本文主要是介绍java8: 因为lambda表达写法造成的编译错误: java.lang.AssertionError: isSubClas,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天在命令行编译的时间遇到了一个以前从来没有遇到的编译错误:

编译器 (1.8.0_401) 中出现异常错误。如果在 Bug Database (http://bugs.java.com) 中没有找到该错误, 请通过 Java Bug 报告页 (http://bugreport.java.com) 建立该 Java 编译器 Bug。请在报告中附上您的程序和以下诊断信息。谢谢。
java.lang.AssertionError: isSubClass DEVICE_T
at com.sun.tools.javac.code.Symbol.isSubClass(Symbol.java:447)
at com.sun.tools.javac.code.Symbol.isMemberOf(Symbol.java:456)
at com.sun.tools.javac.code.Symbol M e t h o d S y m b o l . o v e r r i d e s ( S y m b o l . j a v a : 1479 ) a t c o m . s u n . t o o l s . j a v a c . c o d e . T y p e s MethodSymbol.overrides(Symbol.java:1479) at com.sun.tools.javac.code.Types MethodSymbol.overrides(Symbol.java:1479)atcom.sun.tools.javac.code.TypesImplementationCache.implementationInternal(Types.java:2693)
at com.sun.tools.javac.code.Types I m p l e m e n t a t i o n C a c h e . g e t ( T y p e s . j a v a : 2675 ) a t c o m . s u n . t o o l s . j a v a c . c o d e . T y p e s . i m p l e m e n t a t i o n ( T y p e s . j a v a : 2704 ) a t c o m . s u n . t o o l s . j a v a c . c o d e . S y m b o l ImplementationCache.get(Types.java:2675) at com.sun.tools.javac.code.Types.implementation(Types.java:2704) at com.sun.tools.javac.code.Symbol ImplementationCache.get(Types.java:2675)atcom.sun.tools.javac.code.Types.implementation(Types.java:2704)atcom.sun.tools.javac.code.SymbolMethodSymbol.implementation(Symbol.java:1539)
at com.sun.tools.javac.code.Symbol M e t h o d S y m b o l . i m p l e m e n t a t i o n ( S y m b o l . j a v a : 1528 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . n o t O v e r r i d d e n I n ( R e s o l v e . j a v a : 419 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . i s A c c e s s i b l e ( R e s o l v e . j a v a : 405 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . i s A c c e s s i b l e ( R e s o l v e . j a v a : 365 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . s e l e c t B e s t ( R e s o l v e . j a v a : 1463 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . f i n d M e t h o d I n S c o p e ( R e s o l v e . j a v a : 1633 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . f i n d M e t h o d ( R e s o l v e . j a v a : 1725 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e . f i n d M e t h o d ( R e s o l v e . j a v a : 1677 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . R e s o l v e MethodSymbol.implementation(Symbol.java:1528) at com.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:419) at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:405) at com.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:365) at com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1463) at com.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1633) at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1725) at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1677) at com.sun.tools.javac.comp.Resolve MethodSymbol.implementation(Symbol.java:1528)atcom.sun.tools.javac.comp.Resolve.notOverriddenIn(Resolve.java:419)atcom.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:405)atcom.sun.tools.javac.comp.Resolve.isAccessible(Resolve.java:365)atcom.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1463)atcom.sun.tools.javac.comp.Resolve.findMethodInScope(Resolve.java:1633)atcom.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1725)atcom.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1677)atcom.sun.tools.javac.comp.ResolveMethodReferenceLookupHelper.lookup(Resolve.java:3192)
at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3348)
at com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3333)
at com.sun.tools.javac.comp.Resolve.getMemberReference(Resolve.java:2741)
at com.sun.tools.javac.comp.DeferredAttr D e f e r r e d C h e c k e r . v i s i t R e f e r e n c e ( D e f e r r e d A t t r . j a v a : 1183 ) a t c o m . s u n . t o o l s . j a v a c . t r e e . J C T r e e DeferredChecker.visitReference(DeferredAttr.java:1183) at com.sun.tools.javac.tree.JCTree DeferredChecker.visitReference(DeferredAttr.java:1183)atcom.sun.tools.javac.tree.JCTreeJCMemberReference.accept(JCTree.java:1973)
at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
at com.sun.tools.javac.comp.DeferredAttr F i l t e r S c a n n e r . s c a n ( D e f e r r e d A t t r . j a v a : 913 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . D e f e r r e d A t t r . i s D e f e r r e d ( D e f e r r e d A t t r . j a v a : 1100 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . a t t r i b A r g s ( A t t r . j a v a : 670 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . v i s i t A p p l y ( A t t r . j a v a : 1816 ) a t c o m . s u n . t o o l s . j a v a c . t r e e . J C T r e e FilterScanner.scan(DeferredAttr.java:913) at com.sun.tools.javac.comp.DeferredAttr.isDeferred(DeferredAttr.java:1100) at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:670) at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1816) at com.sun.tools.javac.tree.JCTree FilterScanner.scan(DeferredAttr.java:913)atcom.sun.tools.javac.comp.DeferredAttr.isDeferred(DeferredAttr.java:1100)atcom.sun.tools.javac.comp.Attr.attribArgs(Attr.java:670)atcom.sun.tools.javac.comp.Attr.visitApply(Attr.java:1816)atcom.sun.tools.javac.tree.JCTreeJCMethodInvocation.accept(JCTree.java:1465)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)
at com.sun.tools.javac.comp.Attr.visitReturn(Attr.java:1686)
at com.sun.tools.javac.tree.JCTree J C R e t u r n . a c c e p t ( J C T r e e . j a v a : 1384 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . a t t r i b T r e e ( A t t r . j a v a : 576 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . a t t r i b S t a t ( A t t r . j a v a : 645 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . a t t r i b S t a t s ( A t t r . j a v a : 661 ) a t c o m . s u n . t o o l s . j a v a c . c o m p . A t t r . v i s i t B l o c k ( A t t r . j a v a : 1124 ) a t c o m . s u n . t o o l s . j a v a c . t r e e . J C T r e e JCReturn.accept(JCTree.java:1384) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:645) at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:661) at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1124) at com.sun.tools.javac.tree.JCTree JCReturn.accept(JCTree.java:1384)atcom.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)atcom.sun.tools.javac.comp.Attr.attribStat(Attr.java:645)atcom.sun.tools.javac.comp.Attr.attribStats(Attr.java:661)atcom.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1124)atcom.sun.tools.javac.tree.JCTreeJCBlock.accept(JCTree.java:909)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:645)
at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1013)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)
at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:645)
at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4364)
at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4272)
at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4201)
at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4176)
at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1248)
at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:126)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:169)
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:785)
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

DEVICE_T是我的代码中一个泛型类的泛型参数,在代码中被广泛使用,代码有几千行,一时很难知道到底是哪一行代码出了问题。

同样的代码在Eclipse等IDE中编译可以通过,但是在命令行却不行(同样使用JDK8编译器),这一点我也很不解。

关于这个异常,网上是可以查到很多报告的,如:
https://github.com/oracle/graal/issues/4156
https://bugs.openjdk.org/browse/JDK-8273234
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8071783

按照 《Exception java.lang.AssertionError: isSubClass when building Ghidra》的说明,这是个编译器的BUG,将在JDK 17解决。
我的项目是基于JDK8的,为了这个问题换编译器我可换不起。
只能用最笨的排除法,来尝试查找到底哪一部分的代码触发了这个BUG.
很幸运,最终找到了。
示例如下:

import com.google.common.base.Predicate;public abstract class DaoManagement<DEVICE_T extends DeviceBean>  extends BaseDao<DEVICE_T>{public abstract <B extends DEVICE_T> B copy(B bean, Predicate<Integer> fieldFilter,int... fieldList);public DEVICE_T copy(DEVICE_T deviceBean, DEVICE_T old){/** 在这种情况下,简化的lambda表达写法会引起编译错误 */ return copy(deviceBean, deviceBean::isModified,1,2,3);}
}
public interface BaseBean {public boolean isModified(int i);public boolean isModified(int... columnIDs);
}
public abstract class DeviceBean extends BaseRow{}
public abstract class BaseRow implements BaseBean{@Overridepublic boolean isModified(int i) {return false;}
}public abstract class BaseDao<DEVICE_T extends DeviceBean> {public DEVICE_T copy(DEVICE_T deviceBean, DEVICE_T old){return deviceBean;}
}

如上代码中使用了lambda表达式deviceBean::isModified,这这种写法在命令行编译时会抛出异常:java.lang.AssertionError: isSubClass DEVICE_T

改一下写法就行:v->deviceBean.isModified(v),即:

public abstract class DaoManagement<DEVICE_T extends DeviceBean>  extends BaseDao<DEVICE_T>{public abstract <B extends DEVICE_T> B copy(B bean, Predicate<Integer> fieldFilter,int... fieldList);public DEVICE_T copy(DEVICE_T deviceBean, DEVICE_T old){return copy(deviceBean, v->deviceBean.isModified(v),1,2,3);}
}

这是一种非常偶然问题,一般的项目如果不涉及复杂的泛型参数,不会遇到。记下来备查。

这篇关于java8: 因为lambda表达写法造成的编译错误: java.lang.AssertionError: isSubClas的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992878

相关文章

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解