Java 禁用intellij编译器错误
我得到一个“变量TMP_1可能尚未初始化”错误。以下是片段:Java 禁用intellij编译器错误,java,intellij-idea,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行报告。在我的程序中,如果不执行case1000处的代码块,就不可能到达case1001。显然,Intellij无法理解这一点。如何禁用此错误?我宁愿使用空指针异常进行更改 源代
10 case 1000:
11 Double TMP_1 = len(T$);
12 I = 1d;
13 case 1001:
14 if (I.compareTo(TMP_1) > 0) {
错误正在第14行报告。在我的程序中,如果不执行case1000处的代码块,就不可能到达case1001。显然,Intellij无法理解这一点。如何禁用此错误?我宁愿使用空指针异常进行更改
源代码是由我编写的编译器生成的(源语言是一种古老的BASIC语言)。在第11行重新定位赋值将非常困难
编辑-请参见下面的Mechanical snail说明。这根本不是一个编译器错误;这是一个简单的程序错误。问题是,我模拟BASIC的GOTO语句的方式要求我离开switch语句。当我这样做时,tmp变量超出了范围
最终编辑-我更改了代码生成器以完全删除TMP变量
case 2026:
V = (asc(V$)) - (asc(" "));
dataCursor.restore();
for (J = 1d; J <= ((V * 8d) * 10d); J++) {
X = dataCursor.read();
}
案例2026:
V=(asc(V$)-(asc(“”);
dataCursor.restore();
对于(J=1d;JJava编译器不够聪明,无法证明在执行初始化变量的代码之前,您正在打开的变量永远不会是1001
。请记住,Java变量声明是完全静态的;根据设计,Java只允许以有意义的方式使用变量,即init对于一般代码来说,证明这一点相当于解决停止问题。(就编译器所知,表达式I.compareTo(TMP_1)>0
可能是无意义的,因为它引用的是一个不存在的变量。)。(更准确地说,变量是在开关
语句体的范围内声明的,但如果跳到标签case 1001:
,则初始化变量的代码将不会执行。)
不允许您将此错误转换为警告;这是静态语言的缺点之一。尤其需要:
对于局部变量[…]x的每次访问,必须在访问之前明确指定x,否则会发生编译时错误
在访问之前,变量不是“明确指定的”(如规范中定义的)。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编译器不够聪明,无法证明在初始化变量的代码执行之前,您正在打开的变量永远不会是1001
。请记住,Java变量声明是完全静态的;根据设计,Java只允许以有意义的方式使用您的变量,即在对于一般代码,证明这一点相当于解决停止问题。(就编译器所知,表达式I.compareTo(TMP_1)>0
可能是无意义的,因为它引用的是一个不存在的变量。)。(更准确地说,变量是在开关
语句体的范围内声明的,但如果跳到标签case 1001:
,则初始化变量的代码将不会执行。)
不允许您将此错误转换为警告;这是静态语言的缺点之一。尤其需要:
对于局部变量[…]x的每次访问,必须在访问之前明确指定x,否则会发生编译时错误
在访问之前,变量不是“明确指定的”(如规范中定义的)。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) { ... }
...
}
}
你是说IntelliJ的编译器还没有解决停止问题?我很震惊幸运的是,我不需要解决停顿问题,我只需要IntelliJ来处理这是一个警告,而不是一个错误。@TonyEnnis:你是赏金,你问的是不可能的。我已经用一个解释更新了我的答案。我得到了我想要的。不能再奖励赏金两个小时。这只是一个片段。下面是1001的“goto”。你呢意思是IntelliJ的编译器没有解决停止问题?我很震惊!;)幸运的是,我不需要解决停顿问题,我只需要IntelliJ来处理这是一个警告,而不是一个错误。@TonyEnnis:你是赏金,你问的是不可能的。我已经用一个解释更新了我的答案。我得到了我想要的。不能再奖励赏金两个小时了。这只是一个片段。下面是到1001的“goto”。Rutroh.你是说1000箱中的双TMP_1超出了1001的使用范围吗?它实际上并没有超出范围(在整个开关的主体中共享)。我上面发布的代码是一个片段;使用了两个标签。我无法删除1001。您看到的是一个for循环实现。稍晚一点,“I”将递增,并将控制传递回1001。我正在用switch语句模拟BASIC的goto语句…我希望此错误是一个警告…@TonyEnnis:Wait a第二,您如何将控制权传递回1001?Java根本不支持goto
,甚至不支持切换labels.muahahaha.while(exitVar){switch(goto){…}}}Rut roh。您是说1000情况下的双TMP_1超出了1001的使用范围吗?实际上并没有超出范围(这在开关的整个主体中都是共享的)