Как поймать исключение java unchecked/runtime (в частности, SecurityException)

У меня есть класс Java с методом, который получает изображение с веб-сайта:

private Image image;
private int height;
private int width;
private String imageUri;

public Image getImage() {
    if (image == null) {
        log.info("Fetching image: " + imageUri);
        try {
            URL iURL = new URL(imageUri);
            ImageIcon ii = new ImageIcon(iURL);
            image = ii.getImage();
            height = image.getHeight(null);
            width = image.getWidth(null);
        } catch (SecurityException e) {
            log.error("Unable to fetch image: " + imageUri,e);
        } catch (MalformedURLException e) {
            log.error("Unable to fetch image: " + imageUri,e);
        }
    }
    return image;
}

Проблема в том, что иногда imageUri, который я пытаюсь получить, перенаправляется, в результате чего конструктор ImageIcon генерирует исключение java.lang.SecurityException, которое не перехватывается предложением catch, что приводит к завершению моей программы.

Кто-нибудь может подсказать, как я могу поймать это исключение?

Спасибо

5 ответов

Решение

Поскольку ImageIcon является чрезвычайно старой школой и порождает новый поток (который я не хочу), мое решение заключается в следующем:

public Image getImage() {
    if (image == null) {
        log.info("Fetching image: " + imageUri);
        try { 
            URL iURL = new URL(imageUri);
            InputStream is = new BufferedInputStream(iURL.openStream());
            image = ImageIO.read(is);
            height = image.getHeight();
            width = image.getWidth();
        } catch (MalformedURLException e) {
            log.error("Unable to fetch image: " + imageUri, e);
        } catch (IOException e) {
            log.error("Unable to fetch image: " + imageUri, e);
        }
    }
    return image;
}

Любые проблемы с перенаправлениями, неработающими ссылками и т. Д. Теперь обрабатываются изящно.

Исключение выдается конструктором, который не обернут в блок try.

new ImageIcon(new URL(imageUri))

Использование ImageIcon для загрузки изображения это sooooo 1998. Вам нужен ImageIO.read ().

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

Так как я не хочу добавлять больше зависимостей в мое приложение (=javax), я использовал предложенное здесь решение, чтобы получить растровое изображение, а затем я использовал setImageBitmap, в этом случае ловится исключение SecurityException

Если исключение действительно выдается из getImage(), ваш код должен его перехватить. SecurityException - это исключение. Вы где-то ошиблись. Например, поместите конструктор ImageIcon в пример. Если это не поможет, попробуйте

catch( Throwable th )

Это плохая привычка. Попробуйте хотя бы повторно выбросить его (или исключение оболочки) после регистрации.

Другие вопросы по тегам