4

私は次のクラスを持ち、arg == nullに条件付きブレークポイントを設定したいとします。これはeclipseでは動作せず、 "条件付きブレークポイントにはコンパイルエラーがあります"というエラーが返されます。理由:argは変数に解決できません "。最終的なローカル変数に応じて匿名の内部クラスに条件付きブレークポイントを設定するにはどうすればよいですか?

私はいくつかの関連情報が見つかりましたhereしかし、私は "val $ arg == null"(val $ argはデバッガの変数ビューに表示される変数名です)に条件を変更しても、Eclipseは私に同じエラーを与えます。

public abstract class Test { 

    public static void main(String[] args) { 
     Test t1 = foo("123"); 
     Test t2 = foo(null); 
     t1.bar(); 
     t2.bar(); 
    } 

    abstract void bar(); 

    static Test foo(final String arg) { 
     return new Test() { 
      @Override 
       void bar() { 
       // I want to set a breakpoint here with the condition "arg==null" 
       System.out.println(arg); 
      } 
     }; 
    } 
} 

答えて

2

は、ローカルクラス内のフィールドとして引数を置くことを試みることができます。

static Test foo(final String arg) { 
    return new Test() { 
     private final String localArg = arg; 
     @Override 
      void bar() { 
      // I want to set a breakpoint here with the condition "arg==null" 
      System.out.println(localArg); 
     } 
    }; 
} 
4

私は醜いの回避策を提供することができます:

if (arg == null) { 
    int foo = 0; // add breakpoint here 
} 
System.out.println(arg); 
+1

条件付きブレークポイント*キル*性能、回避策ではありませんので、*私の目...に醜い* –

+0

私はこのコードをスキャンチェックを持っているので、私は多くの場合、ブレークポイントとしてThread.yield()を使用しますそれがリリースされていないことを確認してください。 –

+0

これは必ずしもオプションではない(つまり、クラスが別のJarファイルで定義されている)場合、デバッグ後にコードを元に戻す必要があります。回避策として、私はしばしば以下のようなコードを変更します(そして、そのままにしておきます):String myArg = arg; System.out.println(myArg); – Axel

関連する問題