IDEA里java常见的语言级别,.class字节码版本和jre的常见问题

语言级别是什么呢?

"语言级别(Language Level)指的是编译器支持的 Java 语言特性。每个 Java 版本都会引入新的语言特性,例如 Java 8 引入了 Lambda 表达式和方法引用,Java 11 引入了局部变量类型推断(var)。

语言级别设置决定了你在编写代码时可以使用哪些语言特性,以及编译器如何解释这些特性。"

这个是我网页搜的一句话,我感觉意思就差不多,就比如Record(jdk16引入的),如果你要用,就算你的jdk是16,但是如果你的语言级别不是16那么也会报错

那么很理所当然的,如果你编译到的字节码目标文件(.class)是8,而你的语言级别又设置成16,那么肯定也是报错

看看下面这个例子

maven.compiler.source 设置语言级别,

maven.compiler.target 设置编译的.class的字节码版本

记得要重新加载maven项目,之后会说为啥

可以看到代码没有爆红,但是依旧是提示一样的错误,-source也是指定语言级别,因为我们编译的.class字节码文件是jdk1.8

那么我们默认最大的语言级别也就是8,所以报错是-source 8,我们maven里设置的语言级别是失效的

那么如果我不用Record这些高版本语言级别才有的呢?

依旧跟刚刚一样,语言级别是16,编译的.class字节码是1.8,但是不用Record那些1.8版本没有的东西会怎么样?

源发行版(source version):源代码所使用的Java版本。它指定了我们在编写代码时可以使用的Java语言特性和库。

目标发行版(target version):编译器将源代码编译成的Java字节码的目标版本。它决定了我们的应用程序可以运行的Java版本。

这是网上找的

我们语言级别是多少,源发行版就是多少

目标发行版就是我们编译的.class字节码的版本

所以总结就是无论如何,语言级别的版本一定要 <= 编译的.class字节码版本

刚刚说了maven里的maven.compiler.target标签可以设置编译后的.class文件的字节码版本

那么就看看新手容易爆的错,很容易想到就是你的jdk是1.8版本,而你却想编译17版本的.class字节码

相反,如果你jdk是17版本,那么你就可以编译1.8版本,11版本等等在17版本及其之下的的.class字节码

文件 -> 项目结构

报错 无效的目标发行版: 17

也就是说1.8jdk不能编译到17版本的.class字节码(目标发行版)

相反高版本jdk可以编译成低版本的.class字节码

成功编译成1.8版本的.class

IDEA的配置与Maven配置

maven里的配置和IDEA的配置 谁先谁后?

IDEA配置

IDEA里配置语言级别

文件 -> 项目结构

IDEA里配置.class字节码版本

文件 -> 设置 ->构建,执行,部署 -> 编译器 -> Java编译器

maven配置

那么问题来了到底用哪个

其实就是用的maven的

只要你重新加载了maven,你maven里设置的是什么, 就会同步到IDEA里的设置

比如你maven里的配置是你语言级别是1.8,编译的字节码是1.8 ,那么重新加载maven后你的IDEA的设置里对应的设置也都是1.8

有一点是项目的语言级别是不会覆盖的,模块的才会被覆盖,但也无所谓

其实在你手动设置IDEA对应的配置的时候,IDEA也提示你了,maven如果重新加载了,会覆盖你的配置

jre配置

jre配置位置

默认jre版本是跟jdk一样的

注意区分下jdk和jre,jre是你运行时候的环境

那么如果.class字节码版本高于jre会怎么样,明显也是会报错的

看看下面例子

.class字节码是17的

jre却是1.8的

报错“org/example/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0”

61就是17版本,52就是1.8(8)版本

翻译过来就是.class文件是17的,但是jre却只可以运行1.8及以下的.class

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值