【发布时间】:2011-11-03 03:18:00
【问题描述】:
我在这个程序中遇到了一个最奇怪的错误,在调试它时得到了确认。我有以下代码(归根结底是为了突出问题,当然):
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 语句的行上,这里。 当条件返回 false 时,为什么 Java 会输入 if 语句? 在你问之前,我确实删除了 .class 文件并重新编译它,以防万一有一些残留代码弄乱它,但我得到了相同的结果。请放心,对uSS 变量的所有引用都会显示在此处。
解决方案
事实证明,这似乎是 NetBeans 7.1 Build 201109252201 中的一个错误,其中 IDE 没有正确地将新代码插入到已编译的 .class 文件中。该问题已通过在外部编译文件得到解决。 bug report 已提交。
【问题讨论】:
-
if条件不会做出错误的决定。您的变量uSS必须在您的//More init code行中变为 true。 -
您正在调试的代码和您发布的代码不同(并且您发布的代码由于您删除的位而无法编译)-因此问题可能是由于.每个人都在说你错了,因为你向我们展示的代码不可能像你所说的那样做。但也许你实际运行的代码可以做到这一点。
-
如果您不使用
uSS并添加另一个私有布尔值并使用它会怎样 - 会发生什么?而且,如果 Java 作为优化,如果它们打开,请尝试关闭它们?当代码在调试器和 Netbeans 之外运行时会发生什么? -
您的示例不是自包含的。问题是我们没有人可以获取代码、编译它并重现问题。我理解您为什么不能这样做,但这也意味着我们实际上无法帮助您。您的代码看起来不错,但它不完整(所以我们一直假设问题出在我们看不到的代码中)并且它不是独立的(所以我们自己看不到问题)。你最好的办法是不断减少它,直到你得到一段显示问题的代码,并且只包含你可以发布的方法。其他任何事情都可能会继续在同一个圈子里转。
-
这可能很愚蠢,但请尝试使用稳定版本的 Netbeans。由于我们都看不到问题所在,我们只能假设您尝试一下。
标签: java if-statement netbeans-7