Cómo atrapar una excepción sin control java / tiempo de ejecución (en concreto SecurityException)

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

Pregunta

Tengo clase Java con un método que obtiene una imagen de una página 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;
}

El problema es que a veces el imageUri trato a buscar se le redirecciona automáticamente, haciendo que el constructor ImageIcon para lanzar una java.lang.SecurityException -. Que no se ha caído en la cláusula catch, haciendo que mi programa para terminar

¿Puede alguien sugerir cómo podría detectar esta excepción?

Gracias

¿Fue útil?

Solución 4

Debido a la escuela ImageIcon siendo muy antigua, y generando un nuevo hilo (que no quiero), mi solución es la siguiente:

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

Cualquier problema con redirecciones, enlaces muertos, etc ahora se manejan con gracia.

Otros consejos

La excepción está siendo lanzada por el constructor, que no está envuelto en el bloque try.

new ImageIcon(new URL(imageUri))

El uso de ImageIcon para cargar una imagen es increíblemente 1998. Quiere ImageIO.read () .

Si la excepción de hecho lanzada desde getImage (), el código debe cogerlo. SecurityException es la excepción. Lo tienes mal en alguna parte. Por ejemplo, coloque constructor ImageIcon bajo prueba. Si esto no ayuda, intente

catch( Throwable th )

Es un mal hábito sin embargo. Tratar al menos a volver a tirar (o una excepción envoltorio) después de acceder a él.

Este es un hilo de edad - pero pensé que la adición de una respuesta alternativa desde que lo compré después de alcanzar el mismo problema y golpear este post

.

Ya que no quiero añadir más dependencias a mi aplicación (= javax) He utilizado la solución sugiere aquí obtener el mapa de bits y luego utiliza setImageBitmap en este caso el SecurityException es capturado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top