簡體   English   中英

為什么ListChangeBuilder拋出NullPointerException?

[英]Why is ListChangeBuilder throwing a NullPointerException?

我試圖弄清楚為什么會出現此錯誤:

java.lang.NullPointerException: null
    at javafx.collections.ListChangeBuilder.findSubChange(ListChangeBuilder.java:68)
    at javafx.collections.ListChangeBuilder.insertAdd(ListChangeBuilder.java:127)
    at javafx.collections.ListChangeBuilder.nextAdd(ListChangeBuilder.java:254)
    at javafx.collections.ObservableListBase.nextAdd(ObservableListBase.java:179)
    at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:153)
    at java.util.AbstractList.add(AbstractList.java:108)
    at tech.dashman.dashman.RendererApp$1.handle(RendererApp.java:72)
    at tech.dashman.common.pubnub.NewScreenshotsToRender.handle(NewScreenshotsToRender.java:17)
    at tech.dashman.dashman.PubNubMessageHandler.lambda$message$0(PubNubMessageHandler.java:79)
    at java.lang.Thread.run(Thread.java:748)

它在我的應用程序上發生了兩次,但我不知道如何重現它。 我的代碼中觸發錯誤的行是這樣的:

getActivity().add(new ActivityEntry("..."));

ActivityEntry是具有兩個字段的簡單類。 如有必要,我可以發布代碼,但我認為這無關緊要。 activitygetActivity()返回的,是一個定義如下的字段:

private ObservableList<ActivityEntry> activity = FXCollections.observableArrayList();

發生實際異常的方法如下所示:

private int findSubChange(int idx, final List<ListChangeBuilder.SubChange<E>> list) {
    int from = 0;
    int to = list.size() - 1;

    while (from <= to) {
        int changeIdx  = (from + to) / 2;
        ListChangeBuilder.SubChange<E> change = list.get(changeIdx);

        if (idx >= change.to) {
            from = changeIdx + 1;
        } else if (idx < change.from) {
            to = changeIdx - 1;
        } else {
            return changeIdx;
        }
    }
    return ~from;
}

68行,引發異常的是:

if (idx >= change.to) {

除了ListChangeBuilder的錯誤外,我唯一能想到的是這是一個競爭條件,兩個線程同時修改了ObservableList 看起來像那樣嗎? ObservableList不是線程安全的嗎?

這看起來像一個多線程問題,因此,目前,我的解決方案是通過這種方式定義列表:

private ObservableList<ActivityEntry> activity = FXCollections.synchronizedObservableList(FXCollections.observableArrayList());

由於多線程問題很難重現和調試,因此我不知道這是否真的可以解決問題。 我猜如果不是,我會在生產中再次注意到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM