Как поймать исключение 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 )
Это плохая привычка. Попробуйте хотя бы повторно выбросить его (или исключение оболочки) после регистрации.