[英]Java entering an if statement that is false
我遇到了此程序中最奇怪的錯誤,調試該錯誤時可以確認該錯誤。 我有以下代碼(當然是為了突出問題而簡化):
BHFrame.java
public class BHFrame
{
private boolean uSS;
private StateSaver stateSaver;
public BHFrame(boolean useInternalStateSaver)
{
//Init code
uSS = useInternalStateSaver;
//More init code
System.out.println(uSS);
if (uSS)
{System.out.println("Entered 1");
stateSaver = new StateSaver(title, false);
stateSaver.addSaveable(getThis());
}
//More init code
System.out.println(uSS);
if (uSS)
{System.out.println("Entered 2");
try
{
stateSaver.loadState();
stateSaver.putState(getThis());
}
catch (IOException ex)
{
alertUserOfException(ex);
}
}
}
}
GUI.java
public class GUI extends BHFrame
{
public GUI(boolean useInternalStateSaver)
{
super(useInternalStateSaver);
}
}
Main.java
public class Main
{
public static void main(String[] args)
{
GUI gui = new GUI(false);
}
}
false
false
Entered 2
Exception in thread "main" java.lang.NullPointerException
at bht.tools.comps.BHFrame.<init>(BHFrame.java:26)
at bhms.GUI.<init>(GUI.java:5)
at bhms.Main.main(Main.java:5)
BHFrame
類是從調用此構造函數的子類擴展並運行的,但實際上不應影響此行為。 問題在於,當將false
作為useInternalStateSaver
傳遞給構造useInternalStateSaver
,將跳過第一個if (uSS)
,但輸入第二個。 調試后,我發現在整個運行時, uSS
為false
,包括此處的第二條if
語句行。 當條件返回false
時,Java為什么要輸入if
語句? 在您詢問之前,我確實刪除了.class
文件並重新編譯它,以防萬一有一些殘留的代碼使它混亂,但是我得到了相同的結果。 放心,這里顯示了對uSS
變量的所有引用。
事實證明,這似乎是NetBeans 7.1 Build 201109252201中的錯誤,其中IDE無法正確地將新代碼插入已編譯的.class
文件中。 通過外部編譯文件解決了該問題。 錯誤報告已提交。
無論拋出什么異常,都可能不在您發布的代碼中。
您的catch
語句不會捕獲它,它只會捕獲IOException。
這是NullPointerException,可以在任何地方發生。
您沒有跡象表明if
塊中的代碼實際上正在執行。 在您的屏幕截圖中,絕對有一種知道是否輸入if
塊的方法。 沒有日志記錄語句。
在各個點添加調試消息以查看發生了什么。 或者,您可以查看第26行(在您發布的代碼之前,wayyyyy)以了解為什么會收到NullPointerException。
當機器內存不足時,我已經看到過類似的瘋狂事情。 您可能要運行memtest86。
您可能還考慮刪除所有項目類文件,然后進行構建。 也許您更改了Main.java,但從未對其進行重新編譯。 我討厭那件事發生。
這只是一個猜測,因為我看不到您提到的代碼,但是我認為您已經在第二個//More init code
段中定義了局部變量uSS
。
一旦定義了與實例變量相同的局部變量,它就會“隱藏”該實例變量。 最好用this
來限定所有實例變量。
因此,請嘗試uSS
限定對uSS
所有上述訪問this.
...( this.uSS
)
即使這不是問題,仍然最好張貼完整的代碼。
高溫超導
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.