リストにnull値があるため、NULLポインタ例外がありますadPics
。まれにしか起こらない。どのように可能ですか?並べ替え中に非常に奇妙なNullPointerExceptionが発生しました
(並列にこのコードをダウンロード画像とローカルに保存されます。)
List<String> downloadAdImages(List<String> 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;
}
時々adPics
リストはnull
値を有しています。それがNPEの理由です。しかしどうですか?スレッドで実行されたコードを分析すると、null
の値を追加することはできません。イメージのダウンロードに問題があった場合、IOExceptionがスローされます。 imageNewFileName
はnull
にはなりません。
このコードはJava 8で、Apache Commons IO libを使用しています。
(約質問、downvotesではない)あなたは複数のスレッドからリストに追加しているが、リストが適切に同期されていないためだと思います。あなたがそれをすると面白いことが起こります。 – sstan
あなたは 'awaitTermination'呼び出しがタイムアウトしていないことを確信していますし、同時に要素を追加しながら' adPics'のソートを開始しますか?なぜそれがNPEを投げるのか分かりませんが、 'ArrayList'はスレッドセーフではありませんので、何かが起こると思います。 – Tunaki
うーん..ありがとう@sstan私はhttp://stackoverflow.com/questions/11360401/java-synchronized-list –