【问题标题】:Unable to configure IntelliJ to use Java 11无法将 IntelliJ 配置为使用 Java 11
【发布时间】:2020-04-10 11:26:59
【问题描述】:

虽然 IntelliJ IDE 没有给我任何警告,但是这个两行的方法会导致编译错误Error:(12, 37) java: incompatible types: byte[] cannot be converted to int

import java.math.BigInteger;

public class Test {

    public static void main(String[] args){
        String foo = "123";
        new BigInteger(foo.getBytes(), 1, 1);
    }
}

在 JDK 11 中有一个有效的构造函数,其签名为 public BigInteger(byte[] val, int off, int len)(java.math.BigInteger 的第 306 行),但在 JDK 8 中没有。我能够直接使用 JDK 11 的 javac 编译它,但它失败了正如预期的那样使用JDK 8。我已将 IntelliJ 配置为使用 JDK 11,但我不知道为什么它使用旧版本...System.out.println(System.getProperty("java.version")) 打印 11.0.1。好像是用 JDK 8 编译,用 JDK 11 运行。

我已检查我在以下位置选择了 JDK 11:

  • 运行/调试配置 > JRE
  • 项目结构 > 项目 > 项目 SDK
  • 项目结构 > 项目 > 项目语言级别
  • 项目结构 > 模块 > 语言级别

我正在使用IntelliJ IDEA 2018.2.6 (Community Edition)。重启 IntelliJ 后问题仍然存在。

编辑:

项目使用maven

【问题讨论】:

  • 在我的原始代码中,我有一个以 64 为基数编码的数字,我遇到了同样的问题,我只是简化了问题。
  • 您的代码没有意义。如果要将 String 转换为 BigInteger,请使用 new BigInteger(String)
  • 查看 javadoc:docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/… 接受 byte[] 的构造函数应该是一个“包含 BigInteger 的二进制补码表示的字节子数组”。不是字符串编码的字节数组。
  • 适用于我的 JDK 11。

标签: java maven intellij-idea compiler-errors intellij-14


【解决方案1】:

类似问题的因素可能很少,主要是由于正在使用的其他工具(例如 maven 或 gradle)。

仅使用 IDE 编译和运行代码时应该没有问题(因为使用的 Java 版本已完全配置)。

可以将构建工具(maven、gradle)设置为使用与 IDE 中配置的不同版本的 Java。

要查看终端中运行的这些工具使用的版本:

gradle -version
mvn -version

输出应包含使用这些工具配置的 Java 版本。
他们的 Java 版本主要使用 JAVA_HOME 环境变量,它指向 JRE/JDK 位置。

如果构建工具使用不同的 Java 版本来编译源代码,那么启动应用程序的版本可能会导致此类错误和异常。
该问题与Java8和更新版本之间标准API的变化有关。

JAVA_HOME 变量的值更改为指向Java11 文件夹应该可以完成工作,但如果仍然需要旧版本,例如在使用Maven 时,可以使用该插件:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.11</source>
        <target>1.11</target>
    </configuration>
</plugin>

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 2019-12-24
    • 2013-12-26
    • 2017-11-19
    • 2019-02-27
    相关资源
    最近更新 更多