插入到 ArrayList 时未触发观察点

Watchpoint not triggered when inserting to ArrayList

提问人:Abhinav Singh 提问时间:10/4/2023 最后编辑:Abhinav Singh 更新时间:10/6/2023 访问量:46

问:

我有一个 java 程序,它有一个全局变量,我在上面放了一个观察点来跟踪这个变量的变化。我发现只有在分配到这个变量时才会触发观察点,就像这样,但是当我插入到这个列表中时,观察点没有被触发。我想这是一种正常行为。那么我们可以做任何设置,以便每次从列表中插入或删除时都会触发。ArrayList<Integer> alal = new ArrayList<>

实际代码供参考

public MyClass {

private static ArrayList<Integer> al = new ArrayList(); Put a watchpoint here

public static void main(String args[]){
    al = new ArrayList<>(); // watchpoint gets triggered here
    Integer a = 1;
    al.add(a); // watchpoint not getting triggered here
  }
}

编辑

我的实际情况是可以从其他线程修改此列表,因此我认为在它上面放置一个观察点将是一个好主意,以了解哪个线程修改了它并查看其堆栈跟踪

java intellij-idea

评论

0赞 Zufar Sunagatov 10/4/2023
你能提供你的java代码吗?
0赞 Abhinav Singh 10/4/2023
@ZufarSunagatov添加了我的代码
0赞 Jorn 10/4/2023
1) 您是否在调试模式下运行?2) 其他断点是否正常工作?3) 如果你在命中此代码之前稍微放置一个断点,它会触发吗?然后,您能否继续执行此代码?
0赞 Abhinav Singh 10/4/2023
@Jorn 是 在调试模式下运行,是其他 bp 按预期工作。不明白你的第三个问题
0赞 Jorn 10/4/2023
命中断点后,调试器将有一个“向前单步”按钮。您可以使用它来到达代码中声明未命中断点的位置。这样做可能会告诉你为什么它没有被击中。

答:

2赞 Zufar Sunagatov 10/4/2023 #1

那么我们可以做任何设置,以便每次从列表中插入或删除时都会触发。

好吧,如果从 中添加或删除元素,则不会触发观察点,因为对象本身不会更改。ArrayListArrayList

我有一个想法,您可以监视对 ArrayList 中元素的更改,您需要实现自己的自定义。这样,您可以设置回调函数,每当在列表中添加或删除元素时都会触发这些函数。class ArrayList

import java.util.ArrayList;
import java.util.function.Consumer;

public class CustomObservableArrayList<T> extends ArrayList<T> {

    private Consumer<T> addCallback;
    private Consumer<T> removeCallback;

    public CustomObservableArrayList(Consumer<T> addCallback, Consumer<T> removeCallback) {
        super();
        this.addCallback = addCallback;
        this.removeCallback = removeCallback;
    }

    @Override
    public boolean add(T element) {
        boolean result = super.add(element);
        if (result && addCallback != null) {
            addCallback.accept(element);
        }
        return result;
    }

    @Override
    public boolean remove(Object element) {
        boolean result = super.remove(element);
        if (result && removeCallback != null) {
            removeCallback.accept((T) element);
        }
        return result;
    }
}