Come per la cattura di un'eccezione di runtime Java incontrollato / (in particolare SecurityException)

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

Domanda

Ho classe Java con un metodo che ottiene un'immagine da un sito web:

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;
}

Il problema è che a volte l'imageUri provo a prendere viene reindirizzato, causando il costruttore ImageIcon di gettare un java.lang.SecurityException -. Che non è catturato dalla clausola catch, causando il mio programma per terminare

Qualcuno può suggerire come potrei prendere questa eccezione?

Grazie

È stato utile?

Soluzione 4

A causa ImageIcon essere estremamente vecchia scuola, e generando un nuovo thread (che non voglio), la mia soluzione è la seguente:

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;
}

Eventuali problemi con redirect, ecc link morti sono ora gestiti con grazia.

Altri suggerimenti

L'eccezione viene generata dal costruttore, che non è avvolto nel blocco try.

new ImageIcon(new URL(imageUri))

Utilizzando ImageIcon per caricare un'immagine è tremendamente 1998. Si desidera ImageIO.read () .

Se l'eccezione effettivamente lanciata da getImage (), il codice dovrebbe prenderlo. SecurityException fa eccezione. Hai sbagliato da qualche parte. Per esempio, mettere costruttore ImageIcon sotto prova. Se non aiuta, provare

catch( Throwable th )

E 'una cattiva abitudine però. Provate almeno a ri-lanciare (o un'eccezione involucro) dopo l'accesso di esso.

Questo è un vecchio filo - ma ho pensato di aggiungere una risposta alternativa da quando ho preso dopo aver raggiunto lo stesso problema e di colpire questo post

.

Dato che non voglio aggiungere altre dipendenze alla mia app (= javax) Ho usato la soluzione suggerito qui per ottenere la bitmap e poi ho usato setImageBitmap in questo caso la SecurityException è catturato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top