Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁用intellij编译器错误_Java_Intellij Idea - Fatal编程技术网

Java 禁用intellij编译器错误

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无法理解这一点。如何禁用此错误?我宁愿使用空指针异常进行更改 源代

我得到一个“变量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无法理解这一点。如何禁用此错误?我宁愿使用空指针异常进行更改

源代码是由我编写的编译器生成的(源语言是一种古老的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的使用范围吗?实际上并没有超出范围(这在
开关的整个主体中都是共享的)