今天鸽鸽说,他想学学java,我说好的好的,快学快学(说着我打开了js,对于互抢饭碗的行为没有丝毫羞涩)。
然后鸽鸽说:“俺遇到了问题!俺按照教程写下来的,明明!为什么!为什么我就是一个Exception!”
我说:“莫急莫急,咱们一步一步分析哈。”
于是我打开了我的vscode(为什么不用idea?为了环境一致啊~),然后直接把代码拷贝进来,稍微修改了下格式,run!
咦?
貌似是ok的呢。
我的执行结果
然后,我发现了华点。请仔细看,我的mainloader是
sun.misc.Launcher$AppClassLoader
而鸽鸽呢?
它是:
jdk.internal.loader.ClassLoader$AppClassLoader
哦,不能相互转换的原因,找到了!
对于一个类,如果类加载器不同,那么都是不能划等号的。何况是两个类直接的类型转换。
java的类加载器因为一直秉行着双亲委派机制,所以,对于java基础包中的加载器结构限制十分严重。一旦有重大调整,那么势必不同版本之间,因为类加载器的不同,会造成很多问题。
我稍后便询问了鸽鸽的jdk版本。不出所料,是大神们先驱们的标配——最新版本——jdk13!
然而jdk9之后,应用程序和扩展类都不再是 java.net.URLClassLoader 的实例,因此必然失败。转换版本到1.8就可以解决了。
END。
网友评论