Como pegar uma exceção Java desmarcada/Runtime (especificamente SecurityException)
Pergunta
Eu tenho aula de java com um método que recebe uma imagem de um site:
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;
}
O problema é que, às vezes, o imageuri que tento buscar é redirecionado, fazendo com que o construtor Imageicon jogue um java.lang.securityException - que não é capturado pela cláusula de captura, fazendo com que meu programa termine.
Alguém pode sugerir como eu posso pegar essa exceção?
Obrigado
Solução 4
Devido ao Imageicon ser extremamente antigo e gerando um novo tópico (que eu não quero), minha solução é a seguinte:
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;
}
Quaisquer problemas com redirecionamentos, links mortos etc. agora são tratados graciosamente.
Outras dicas
A exceção está sendo lançada pelo construtor, que não está envolvido no bloco de tentativas.
new ImageIcon(new URL(imageUri))
Usando o imageicon para carregar uma imagem é muuuito 1998. Você quer Imageio.read ().
Se a exceção de fato jogada de getImage (), seu código deve pegá -lo. SecurityException é exceção. Você entendeu errado em algum lugar. Por exemplo, coloque o construtor Imageicon em TENT. Se não ajudar, tente
catch( Throwable th )
É um mau hábito. Tente pelo menos reutrevê-lo (ou uma exceção do invólucro) depois de registrá-lo.
Este é um tópico antigo - mas pensei em adicionar uma resposta alternativa desde que o recebi depois de atingir o mesmo problema e acertar este post.
Como não quero adicionar mais dependências ao meu aplicativo (= javax), usei o solução sugerida aqui Para pegar o bitmap e então eu usei setImageBitmap neste caso o Exceção de segurança está capturado