このプログラムで最も奇妙なエラーに遭遇しました。これはデバッグ時に確認されています。次のコードがあります(もちろん、問題を強調するために要約しています):
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)
はスキップされますが、2 番目は入力されます。デバッグ時に、ここで 2 番目のステートメントの行を含め、ランタイム全体であることuSS
がわかりました。条件が返されたときにJava がステートメントを入力するのはなぜですか? あなたが尋ねる前に、私はファイルを削除して再コンパイルしましたが、残りのコードが混乱していた場合に備えて、同じ結果が得られました. 安心してください。変数へのすべての参照がここに表示されます。false
if
if
false
.class
uSS
解決
結局のところ、これは NetBeans 7.1 ビルド 201109252201 のバグで、IDE が新しいコードをコンパイル済み.class
ファイルに適切に挿入しないようです。この問題は、ファイルを外部でコンパイルすることで修正されました。バグレポートが提出されました。