java list 排序相等就出现空指针_java – 排序时非常奇怪的NullPointerException

本文探讨了在Java 8中,使用FixedThreadPool并发下载图片时,为何偶尔会出现因列表adPics包含空值引发的空指针异常。作者分析了awaitTermination可能不会阻止线程继续执行的问题,并提出了中断线程来解决空值问题的方法。
摘要由CSDN通过智能技术生成

我有一个空指针异常,因为列表adPics上有一些空值.它很少发生.这怎么可能?

(此代码并行下载图像并在本地保存.)

List downloadAdImages(List imagesUrls, final String itemFolder) {

final List adPics = new ArrayList<>();

final ExecutorService executor = newFixedThreadPool(20);

imagesUrls.forEach(

picUrl -> executor.submit(() -> {

try {

String imageNewFileName = imagesUrls.indexOf(picUrl) + "." + getExtension(picUrl);

String bigPicUrl = picUrl.replace("b.jpg", "ab.jpg"); // big version

copyURLToFile(new URL(bigPicUrl), new File(itemFolder, imageNewFileName), 10, 10);

adPics.add(imageNewFileName);

} catch (IOException ex) {

log.log(Level.WARNING, "Could not download image {0} ({1})", new Object[]{picUrl, ex.getMessage()});

}

}));

executor.shutdown();

try {

executor.awaitTermination(15L, MILLISECONDS);

} catch (InterruptedException ex) {

log.log(Level.WARNING, "Could not wait for all images downloads");

}

Collections.sort(adPics); // null values at list lead to NPE here. How are there null values?

return adPics;

}

FRYQf.png

有时,adPics列表具有空值.这就是NPE的原因.但是怎么样?分析线程中执行的代码,无法添加空值.如果下载图像时出现问题,则会抛出IOException. imageNewFileName不能为null.

此代码是Java 8,它使用Apache Commons IO lib.

最佳答案 方法awaitTermination不会停止正在运行的线程.它只等待所有线程完成或达到超时.因此,您的线程仍在向列表中添加项目.

此外,您应该考虑即使达到超时,下载和复制到文件系统也在运行.

一个简单但不完美的解决方案是在达到超时时设置一个标志,并在添加更多项之前检查标志.

更好的方法是在达到超时后中断线程.这还应包括中断下载和文件复制.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值