8

このプログラムで最も奇妙なエラーに遭遇しました。これはデバッグ時に確認されています。次のコードがあります(もちろん、問題を強調するために要約しています):

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 がステートメントを入力するのはなぜですか? あなたが尋ねる前に、私はファイルを削除して再コンパイルしましたが、残りのコードが混乱していた場合に備えて、同じ結果が得られました. 安心してください。変数へのすべての参照がここに表示されます。falseififfalse.classuSS

解決


結局のところ、これは NetBeans 7.1 ビルド 201109252201 のバグで、IDE が新しいコードをコンパイル済み.classファイルに適切に挿入しないようです。この問題は、ファイルを外部でコンパイルすることで修正されました。バグレポートが提出されました。

4

3 に答える 3

1

その例外をスローしているものは、おそらく投稿されたコードに はありません。

catchIOException のみをキャッチ するステートメントではキャッチされません。

これは NullPointerException であり、どこでも発生する可能性があります。

ifブロック内のコードが実際に実行されていることを示していません。ifスクリーンショットには、ブロックが入力されたかどうかを知る絶対的な方法があります。ログ ステートメントはありません。

さまざまな時点でデバッグ メッセージを追加して、何が起こっているかを正確に確認します。または、26 行目 (投稿されたコードの前の wayyyyy) を見て、NullPointerException が発生している理由を確認してください。

于 2011-11-03T03:37:11.690 に答える
0

マシンに不良 RAM があると、このようなおかしなことが起こります。memtest86 を実行するとよいでしょう。

プロジェクト クラス ファイルをすべて削除してから、ビルドを実行することも検討してください。Main.java を変更した可能性がありますが、再コンパイルされていません。こうなったら嫌です。

于 2011-11-03T03:32:14.480 に答える
0

あなたが言及しているコードを見ることができないので、これは単なる推測ですがuSS、2 番目の//More init codeセグメントでローカル変数を定義したと思います。

インスタンス変数と同じ名前のローカル変数を定義すると、インスタンス変数が「非表示」になります。すべてのインスタンス変数を で修飾することをお勧めします。this

uSSしたがって、上記のすべてのアクセスをwith this.... ( this.uSS)で修飾してみてください。

これが問題ではない場合でも、とにかく完全なコードを投稿することをお勧めします。

HTH

于 2011-11-03T03:32:29.710 に答える