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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top