gpt4 book ai didi

java - 禁用 intellij 编译器错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:49 24 4
gpt4 key购买 nike

我收到“变量 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com