8

我在这个程序中遇到了最奇怪的错误,在调试它时得到了确认。我有以下代码(归根结底是为了突出问题,当然):

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

解决方案


事实证明,这似乎是 NetBeans 7.1 Build 201109252201 中的一个错误,其中 IDE 没有正确地将新代码插入到编译.class文件中。该问题已通过在外部编译文件得到解决。已提交错误报告。

4

3 回答 3

1

引发该异常的任何东西都可能不在您发布的代码中。

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

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

您没有表明您的if块内的代码实际上正在执行。在您的屏幕截图中,绝对有办法知道您的if块是否被输入。没有日志记录语句。

在各个点添加调试消息以准确查看正在发生的事情。或者,您知道,请查看第 26 行(在您发布的代码之前的方式)以了解为什么您会收到 NullPointerException。

于 2011-11-03T03:37:11.690 回答
0

当机器上有坏的 RAM 时,我见过像这样的疯狂的东西。您可能想要运行 memtest86。

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

于 2011-11-03T03:32:14.480 回答
0

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

一旦定义了与实例变量同名的局部变量,它就会“隐藏”实例变量。最好用 . 限定所有实例变量。this

uSS因此,请尝试使用this.... ( this.uSS)限定所有上述访问

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

高温高压

于 2011-11-03T03:32:29.710 回答