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

StackOverflow https://stackoverflow.com/questions/1548045

Вопрос

У меня есть класс 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, в результате чего моя программа завершается.

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

Спасибо

Это было полезно?

Решение 4

Из-за того, что 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 для загрузки изображения - это оооочень 1998.Ты хочешь ImageIO.читать().

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

catch( Throwable th )

Хотя это плохая привычка.Попробуйте, по крайней мере, повторно создать его (или исключение оболочки) после его регистрации.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top