我遇到了这个程序中最奇怪的错误,在调试它时会得到确认。我有以下代码(当然可以突出显示问题):
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
。在调试时,我发现整个运行时false
是if
,包括第二个if
语句的行。 当条件返回false
时,为什么Java会输入.class
语句?在你提问之前,我确实删除了uSS
文件并重新编译它以防万一一些残留的代码弄乱了它,但我得到了相同的结果。请放心,此处显示.class
变量的所有引用。
事实证明,这似乎是NetBeans 7.1 Build 201109252201中的一个错误,其中IDE未正确地将新代码插入到已编译的{{1}}文件中。通过外部编译文件解决了这个问题。已提交bug report。
答案 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,但它从未重新编译过。我讨厌发生这种情况。