Как перехватить непроверенное исключение java / 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, в результате чего моя программа завершается.
Кто-нибудь может подсказать, как я мог бы перехватить это исключение?
Спасибо
Решение 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 пойман