【问题标题】:How to set conditional breakpoint in anonymous inner class depending on final local variable?如何根据最终局部变量在匿名内部类中设置条件断点?
【发布时间】:2011-01-19 09:26:53
【问题描述】:

假设我有以下课程,并希望在标记位置的 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); 
            }
        };
    }
}

【问题讨论】:

    标签: java eclipse conditional-breakpoint anonymous-inner-class


    【解决方案1】:

    我只能提供一个丑陋的解决方法:

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

    【讨论】:

    • 条件断点 kill 性能,所以解决方法在我看来并不是 那个难看...
    • 我经常使用 Thread.yield() 作为断点,因为我有一个检查来扫描此代码以确保它没有被释放。
    • 这并不总是一个选项(即当类在单独的 Jar 文件中定义时),您必须在调试后将代码改回来。作为一种解决方法,我经常像这样更改代码(并保留它): String myArg = arg; System.out.println(myArg);
    • @Peter,你能详细说明一下“确保它没有被发布”吗?
    • @Axel,在调试控制台中运行时,大量打印语句很麻烦。你能改用记录器吗?
    【解决方案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); 
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多