Поскольку вопрос касался основной причины этого исключения, вот ответ:
org.apache.poi.ss.util.ImageUtils.getImageDimension делает следующее:
Если данный тип имеет тип Workbook.PICTURE_TYPE_JPEG
или Workbook.PICTURE_TYPE_PNG
или Workbook.PICTURE_TYPE_DIB
, то он использует javax.imageio.ImageIO
для создания ImageInputStream
из заданного InputStream
.Затем он получает Iterator
возможных ImageReader
с для этого ImageInputStream
.И тогда это делает неправильно.Он вызывает Iterator.next
, чтобы получить первый возможный ImageReader
, не проверяя, есть ли у Iterator
следующий элемент вообще.Это выдает java.util.NoSuchElementException
, если в Iterator
нет следующего элемента.
Но почему в Iterator
нет следующего элемента?Поскольку существует только один вызов Iterator.next
, в Iterator
нет даже одного ImageReader
.У Iterator
нет даже одного элемента.Но это означает, что javax.imageio.ImageIO
не смог найти зарегистрированный в настоящее время ImageReader
, который утверждает, что может декодировать поставленный ImageInputStream
.И это означает, что либо данный InputStream
не был InputStream
из jpeg
, png
или bmp
изображения, либо в настоящее время не зарегистрировано ImageReader
, которое утверждает, что может декодировать jpeg
, png
или bmp
изображений правильно.
Так как он выходит из строя только в других средах и никогда не выходит из строя в локальной среде OP, первый вариант неприменим.Поэтому я подозреваю, что в случае сбоя в настоящий момент не будет зарегистрировано ImageReader
, которые утверждают, что способны правильно декодировать jpeg
, png
или bmp
изображений.Итак, я бы сделал следующее:
Первый: определение, с каким типом изображения он выходит из строя (jpeg
, png
или bmp
).
Второй: определение того, в какой среде происходит сбой(операционная система, Java
версия, используемые платформы, ...).
Версия apache poi
не имеет значения, поскольку даже apache poi 4.0.1
делает тот же неправильный вызов Iterator.next
без проверки Iterator.hasNext
первый: org.apache.poi.ss.util.ImageUtils.getImageDimension .