如何捕获java unchecked / runtime异常(特别是SecurityException)

时间:2009-10-10 14:10:10

标签: java exception runtime try-catch unchecked

我有一个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 个答案:

答案 0 :(得分:1)

构造函数抛出了异常,它没有包含在try块中。

new ImageIcon(new URL(imageUri))

答案 1 :(得分:1)

使用ImageIcon加载图像是sooooo 1998.你想要ImageIO.read()

答案 2 :(得分:0)

如果确实从getImage()抛出了异常,那么你的代码应该捕获它。 SecurityException是Exception。你在某个地方弄错了。例如,在try下放置ImageIcon构造函数。如果没有帮助,请尝试

catch( Throwable th )

但这是一个坏习惯。记录后至少尝试重新抛出它(或包装器异常)。

答案 3 :(得分:0)

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

现在可以优雅地处理重定向,死链接等问题。

答案 4 :(得分:0)

这是一个老线程 - 但是我想到在我遇到同样的问题并点击这篇文章后得到了另一个答案。

因为我不想在我的应用中添加更多依赖项(= javax) 我使用solution suggested here获取位图,然后使用 setImageBitmap ,在这种情况下捕获了 SecurityException