Класс javax.swing.ImageIcon
имеет конструктор с одним параметром byte[]
. Вот часть кода для этого конструктора:
this.image = Toolkit.getDefaultToolkit().createImage(imageData);
if (image == null) {
return;
}
Иногда, когда я вызываю этот конструктор, image
действительно нулевой, и я не могу понять, почему. Проверка исходного кода для класса java.awt.Toolkit
показывает, что метод createImage(byte[])
вызывает абстрактный метод createImage(byte[], int, int)
. Из моей отладки stati c метод getDefaultToolkit()
класса java.awt.Toolkit
возвращает экземпляр sun.awt.windows.WToolkit
, суперкласс которого sun.awt.SunToolkit
, и этот класс содержит реализацию для метода createImage(byte[], int, int)
. Я искал в Inte rnet исходный код для метода createImage(byte[], int, int)
в классе sun.awt.SunToolkit
и обнаружил, что он содержит одну строку:
return createImage(new ByteArrayImageSource(data, offset, length));
Теперь наступает момент, когда я могу что-то упустить. Класс sun.awt.image.ByteArrayImageSource
расширяет класс sun.awt.image.InputStreamImageSource
, а класс sun.awt.image.InputStreamImageSource
реализует интерфейс sun.awt.image.ImageProducer
, поэтому я думаю, что метод createImage(new ByteArrayImageSource(data, offset, length)
ссылается на метод createImage(ImageProducer)
в классе SunToolkit
. Я посмотрел исходный код для метода createImage(ImageProducer)
, а также код для конструктора ByteArrayImageSource
, и я не могу понять, почему какой-либо из методов createImage()
вернул бы ноль. Кстати, класс InputStreamImageSource
не имеет конструктора.
Поэтому мой вопрос таков: почему java.awt.Toolkit.getDefaultToolkit().createImage(byte[])
иногда возвращает ноль?
Обратите внимание, что я не могу предоставить пример кода чтобы воспроизвести проблему, потому что иногда один и тот же байтовый массив приводит к созданию изображения, а иногда - нет. По сути, я просто вызываю конструктор ImageIcon
и передаю ему байтовый массив.
Это приложение Swing , и весь код выполняется в потоке диспетчеризации событий (EDT).