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