Java输入if语句为false

时间:2011-11-03 03:18:01

标签: java if-statement netbeans-7

我遇到了这个程序中最奇怪的错误,在调试它时会得到确认。我有以下代码(当然可以突出显示问题):

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传递给构造函数时,会跳过第一个if (uSS),但会输入第二个uSS。在调试时,我发现整个运行时falseif,包括第二个if语句的行。 当条件返回false时,为什么Java会输入.class语句?在你提问之前,我确实删除了uSS文件并重新编译它以防万一一些残留的代码弄乱了它,但我得到了相同的结果。请放心,此处显示.class变量的所有引用。

解决方案


事实证明,这似乎是NetBeans 7.1 Build 201109252201中的一个错误,其中IDE未正确地将新代码插入到已编译的{{1}}文件中。通过外部编译文件解决了这个问题。已提交bug report

3 个答案:

答案 0 :(得分:1)

在您发布的代码中,抛出该异常的任何内容可能

它没有被catch语句捕获,它只捕获IOException。

这是一个NullPointerException,可以在任何地方发生。

您没有显示if块中的代码实际正在执行的迹象。在屏幕截图中,绝对知道如何确定是否输入了if块。没有记录声明。

在各个点添加调试消息,以准确查看发生的情况。或者,你知道,看看第26行(在你发布的代码之前的wayyyyy),看看为什么你会得到一个NullPointerException。

答案 1 :(得分:0)

这只是猜测,因为我看不到你提到的代码,但我认为你已经在第二个uSS段中定义了一个局部变量//More init code

一旦定义了一个名为 instance 变量的 local 变量,它就会“隐藏”实例变量。最好使用this限定所有实例变量。

因此,请尝试使用uSS this. this.uSS来验证{{1}}的所有上述访问权限。{{1}}

即使这不是问题,最好还是发布完整的代码。

HTH

答案 2 :(得分:-1)

当机器上有坏RAM时,我看到过这样的疯狂事情。您可能想要运行memtest86。

您可能还会考虑删除所有项目类文件,然后进行构建。也许你改变了Main.java,但它从未重新编译过。我讨厌发生这种情况。