Источник, который у меня есть (Java5, но я сомневаюсь, что он сильно изменился), утверждает, что, если не зарегистрировано ни одного поставщика услуг ImageInputStream, метод createImageInputStream
возвращает ноль, и таким образом вы получаете это исключение.JavaDoc на IIORegistry.getDefaultInstance()
, который используется ImageIO
:
Каждая группа ThreadG будет получать свой собственный экземпляр;это позволяет различным апплетам в одном и том же браузере (например) каждому иметь свой собственный реестр.
Таким образом, на самом деле это может быть проблема с многопоточностью, поскольку вы получаете простой новый экземпляр IIORegistry
.
Редактировать: копая глубже в источник, я нашел следующее:
Скорее всего, вы получите FileImageInputStream
, так как вы передаете файл.Однако, если возникает исключение, поставщик услуг возвращает null
.Таким образом, может быть выброшен FileNotFoundException
или любой другой IOException
, что приведет к тому, что поток не будет создан.
К сожалению, в коде нет регистрации, поэтому вам придется как-то отлаживать.Вероятно, это связано с отсутствием прав доступа к файлу, поврежденным / неполным файлом или отсутствующим файлом.
Вот исходный код Java5 для FileImageInputStreamSpi#createInputStreamInstance()
public ImageInputStream createInputStreamInstance(Object input,
boolean useCache,
File cacheDir) {
if (input instanceof File) {
try {
return new FileImageInputStream((File)input);
} catch (Exception e) {
return null;
}
} else {
throw new IllegalArgumentException();
}
}