Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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_List_Javafx_Observablecollection - Fatal编程技术网

Java 尝试交换可观察列表中的元素时出现异常?

Java 尝试交换可观察列表中的元素时出现异常?,java,list,javafx,observablecollection,Java,List,Javafx,Observablecollection,我有以下代码,看起来非常简单明了: public static void main(String[] args) { Series<String, Number> series = new Series<String, Number>(); ObservableList<Data<String, Number>> list = series.getData(); list.add(new Data<String,Nu

我有以下代码,看起来非常简单明了:

public static void main(String[] args) {
    Series<String, Number> series = new Series<String, Number>();
    ObservableList<Data<String, Number>> list = series.getData();

    list.add(new Data<String,Number>("1", new Double(1)));
    list.add(new Data<String,Number>("2", new Double(2)));
    list.add(new Data<String,Number>("3", new Double(3)));
    list.add(new Data<String,Number>("4", new Double(4)));
    int size = list.size();
    for (int i = 0; i < size-1; i++) {
        list.set(i, list.get(i+1));
    }
    list.remove(size-1);
}

嗯,很有趣。这在JavaFX8上很容易复制。事实上,即使使用以下简化代码,崩溃仍然会发生:

public static void main(String[] args) {
    Series<String, Number> series = new Series<>();
    ObservableList<Data<String, Number>> list = series.getData();
    list.add(new Data<>("1", 1.0));
    list.set(0, new Data<>("2", 2.0));
}
publicstaticvoidmain(字符串[]args){
系列=新系列();
ObservableList=series.getData();
增加(新数据(“1”,1.0));
列表集(0,新数据(“2”,2.0));
}
据我所知,
XYChart
试图保持一个内部链接列表与对
observeList
的更改保持同步,这段代码中有一个bug。我建议的唯一解决方法是将数据复制到一个普通列表中,对其进行修改,然后使用修改后的数据创建一个新的
系列。然后删除旧的
系列
,并将新的
系列
添加到图表中


两个旁白:没有必要调用
新的Double(1)
;您可以简单地使用double literal 1.0(正如我在上面所做的),因为它将被装箱到一个
double
中,因为在该参数位置需要一个
Number
。此外,该示例仅从列表中删除第一个元素,这可以通过使用
list.remove(0)
替换整个循环来实现。但是其他的变化,比如简单地设置一个新的值,似乎会导致NPE,所以这看起来确实像一个bug。

这个问题(特别是stacktrace)看起来像是JavaFX 8u20中修复的问题。我在我的机器上安装了8u20,测试了Stuart注释中给出的代码,也看不到异常。

我的问题的可能重复部分实际上不是空指针,而是此列表中元素的正确设置请显示完整堆栈跟踪。什么是
observeList
以及
series.getData()
返回?当E为null且此列表不允许null时抛出NPE(当然,如果ObservableList是一个impl of list)没有足够的信息。需要查看Series()和Series.getData()
public static void main(String[] args) {
    Series<String, Number> series = new Series<>();
    ObservableList<Data<String, Number>> list = series.getData();
    list.add(new Data<>("1", 1.0));
    list.set(0, new Data<>("2", 2.0));
}