关于我在使用stream().toList()遇到的问题
问题描述
在测试以上程序的时候抛出了空指针异常
于是我以为是我数据库中存在null字段,但查看后发现并不存在为null的数据
问题排查
起初我以为问题出现在sort排序方法这,事实也确实是,当我把sort语句去掉的时候程序就跑通了,但我想不明白是为什么,于是我对每次对比都加上一个非空判断但程序仍然报错。我猜问题应该不出在这里。然后我往前找问题最终发现问题出在这条语句上
courseSelections = courseSelections.stream()
.filter(o->o.getScore().compareTo(BigDecimal.ZERO)>0)
.toList();
问题解决
原因:从java16
开始Stream.toList() 返回不可变集合
由于我前面使用的是toList()方法返回集合,所以我courseSelections
是不可变的,因此我在进行排序的时候会抛出异常。
解决方法:
//将toList() 改为collect(Collectors.toList())
courseSelections = courseSelections.stream()
.filter(o->o.getScore().compareTo(BigDecimal.ZERO)>0)
.collect(Collectors.toList());
这样修改之后就不存在之前的错误了,因为collect(Collectors.toList())
返回的是可变集合
疑问+1
如果只有以上问题的话应该抛出的是UnsupportedOperationException
这个异常,但是为什么我的是null呢,难道我其他地方存在空指针问题吗?其实并不是,是因为我的项目里的全局异常处理器
作了简化处理
当我把这个处理器去掉
确实是UnsupportedOperationException
异常