Как поймать sun.awt.image.PNGImageDecoder $ PNGException? - PullRequest
1 голос
/ 28 декабря 2011

Как перехватить следующее исключение, которое выводится на консоль ошибок при попытке загрузить поврежденный файл PNG:

sun.awt.image.PNGImageDecoder$PNGException: invalid depth
    at sun.awt.image.PNGImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)

Следующий код заставляет вышеуказанный вывод появиться в консоли ошибок. Но исключение никогда не ловится:

import javax.swing.ImageIcon;

public class TestBadPNG
  {

    public static void main(String[] args)
      {
        try
          {
            new ImageIcon(new byte[] { -119, 80, 78, 71, 13, 10, 26, 10, 0, });
          }
        catch (Exception e)
          {
            // This line will not be reached.
            System.err.println("Bad image.");
          }
      }
  }

Возможно, изображение должно быть загружено другим способом?

Спасибо!

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Я не знаком с ImageIcon , но вы можете просто сначала попытаться создать изображение из вашего источника (ваш массив byte [] ) и , затем , если все идет хорошо, создайте ImageIcon .

Примерно так:

    ByteArrayInputStream bas = new ByteArrayInputStream( new byte[] { -119, 80, 78, 71, 13, 10, 26, 10, 0, } );
    Image img = null;
    try {
        img = ImageIO.read( bas );
    } catch (IOException e) {
        ... // You'll catch that one should it happen...
    }

, а затем, если все будет хорошо, создайте ImageIcon:

ImageIcon ii = new ImageIcon( img );
0 голосов
/ 28 декабря 2011

Как сказал @MikeNakis, появляется новый Thread. Фактически, ImageIcon делегирует загрузку изображения в MediaTracker, который порождает Thread и предоставляет методы для ImageIcon, чтобы получить статус изображения

Попробуйте использовать getImageLoadStatus(), который возвращает базовый статус изображения в MediaTracker

Вы не можете избавиться от исключения, так как исключения отслеживаются MediaTracker. и отправил в систему ошибаться. Кстати, вероятно, есть способ перенаправить системную ошибку в другое место и поддерживать консоль приложения в чистоте

0 голосов
/ 28 декабря 2011

Это исключение выбрасывается из отдельного потока, а не из основного потока. На самом деле ваше приложение выполнено успешно.

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