java - 禁用 intellij 编译器错误

标签 java intellij-idea

我收到“变量 TMP_1 可能尚未初始化”错误。这是片段:

10  case 1000:
11       Double TMP_1 = len(T$);
12       I = 1d;
13  case 1001:
14       if (I.compareTo(TMP_1) > 0) {

错误在第 14 行报告。在我的程序中,如果不执行 case 1000 处的代码块,就不可能到达 case 1001。显然 Intellij 无法弄清楚这一点。我怎样才能禁用这个错误?我宁愿用空指针异常来进行更改。

源代码是由我编写的编译器生成的(源语言是古老的 BASIC。)重新定位第 11 行的赋值将非常困难。

编辑 - 请参阅下面机械蜗牛的解释。这根本不是编译器错误;而是编译器错误。这是一个简单的程序错误。问题是我模拟 BASIC GOTO 语句的方式要求我保留 switch 语句。当我这样做时,tmp 变量超出了范围。

最终编辑 - 我更改了代码生成器以完全删除 TMP 变量。

case 2026:
          V = (asc(V$)) - (asc(" "));
          dataCursor.restore();
          for (J = 1d; J <= ((V * 8d) * 10d); J++) {
               X = dataCursor.read();
          }

以前,for 循环中的算术是使用 2026 标签之前设置的 tmp 变量完成的。现在因为没有,所以没有问题。

最佳答案

Java 编译器不够聪明,无法证明您要打开的变量在初始化变量的代码执行之前永远不会是 1001。请记住,Java 变量声明是完全静态的;根据设计,Java 只允许以有意义的方式使用变量,即在使用前进行初始化。对于一般代码来说,证明这种情况发生就相当于解决停机问题。 (就编译器所知,表达式 I.compareTo(TMP_1) > 0 可能是无意义的,因为它引用了一个不存在的变量。(更准确地说,该变量是在 switch 语句主体的范围内声明的,但如果跳到标签 case 1001:,初始化它的代码将不会执行。))

您不能将此错误转变为警告;这是静态语言的缺点之一。特别是Java Language Specification, chapter 16要求:

For every access of a local variable [...] x, x must be definitely assigned before the access, or a compile-time error occurs.

并且变量在访问之前未“明确分配”(如规范中所定义)。 IntelliJ 使用 Java 编译器(通常是 javac)编译您的代码。由于标准要求您要做的事情是错误的,所以您想要的事情是不可能的(如果不编辑编译器,那么它就不再是 Java 了)。

解决方法

相反,只需在周围范围中声明变量,并将其初始化为虚拟值即可。例如:

Double TMP_1 = null;
while(exitVar) {
    switch(lblToGoTo) {
        ...
        case 1000:
            TMP_1 = len(T$);
            I = 1d;
        case 1001:
            if (I.compareTo(TMP_1) > 0) { ... }
        ...
    }
}

关于java - 禁用 intellij 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755910/

相关文章:

java - 无法删除 fragment

java - 如何合并 10 万条 MySQL 行

java - 使用 javac 和 java 编译时出现问题

javascript - IntelliJ 中的 karma 配置

intellij-idea - PHPStorm 中是否有删除当前打开文件的快捷方式?

java - Unicode 不显示希腊字符

java - 从 Eclipse 导出的 JAR 中排除 JUnit

java - 当我运行我的 spring 应用程序时,它显示抛出错误

gradle - 无法使用Gradle运行应用程序:错误:找不到或加载主类1.8

java - 我很难启动我的 IntellijIDEA 2019.2