簡體   English   中英

Java輸入錯誤的if語句

[英]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) ,但輸入第二個。 調試后,我發現在整個運行時, uSSfalse ,包括此處的第二條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.

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