java .awt.Toolkit.getDefaultToolkit (). CreateImage (byte []) Возвращает ноль - PullRequest
0 голосов
/ 09 февраля 2020

Класс 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...