簡體   English   中英

禁用IntelliJ編譯器錯誤

[英]disable an intellij compiler error

我收到“變量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行報告。在我的程序中,如果不執行案例1000的代碼塊,就無法進入案例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: ,則初始化它的代碼將不會執行case 1001: 。))

您無權將此錯誤變成警告; 這是靜態語言的缺點之一。 特別是Java語言規范的第16章要求:

對於局部變量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) { ... }
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM