Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据最终的局部变量在匿名内部类中设置条件断点?_Java_Eclipse_Conditional Breakpoint_Anonymous Inner Class - Fatal编程技术网

Java 如何根据最终的局部变量在匿名内部类中设置条件断点?

Java 如何根据最终的局部变量在匿名内部类中设置条件断点?,java,eclipse,conditional-breakpoint,anonymous-inner-class,Java,Eclipse,Conditional Breakpoint,Anonymous Inner Class,假设我有以下类,并希望在标记位置的arg==null上设置一个条件断点。这在eclipse中不起作用,并给出错误“条件断点有编译错误。原因:arg无法解析为变量” 我找到了一些相关信息,但即使我将条件更改为“val$arg==null”(val$arg是调试器的变量视图中显示的变量名),eclipse也会给我同样的错误 public abstract class Test { public static void main(String[] args) { Test t

假设我有以下类,并希望在标记位置的arg==null上设置一个条件断点。这在eclipse中不起作用,并给出错误“条件断点有编译错误。原因:arg无法解析为变量”

我找到了一些相关信息,但即使我将条件更改为“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); 
            }
        };
    }
}

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

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

您可以尝试将参数作为字段放置在本地类中

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); 
        }
    };
}

条件断点会破坏性能,因此在我看来,解决方法并没有那么难看……我经常使用Thread.yield()作为断点,因为我有一个检查,可以扫描此代码以确保其未发布。这并不总是一个选项(即当类在单独的Jar文件中定义时),在调试之后,您必须重新更改代码。作为一种解决方法,我经常这样更改代码(并将其保留在其中):String myArg=arg;系统输出打印项次(myArg)@Peter,你能详细说明一下“确保它不会被发布”吗?@Axel,在调试控制台中运行时,大量的打印语句是个麻烦。你能改用记录器吗?