[英]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.