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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("