我有一个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 子句捕获,从而导致我的程序终止。

谁能建议我如何捕捉这个异常?

谢谢

有帮助吗?

解决方案 4

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

使用重定向,死链接等的任何问题现在处理正常。

其他提示

异常正在由构造,这是不包裹在try块抛出。

new ImageIcon(new URL(imageUri))

使用 ImageIcon 加载图像是 1998 年的事情。你要 ImageIO.read().

如果从的getImage的确抛出的异常(),您的代码应该抓住它。抛出:SecurityException是例外。你弄错了地方。例如,将ImageIcon的构造下试一下。如果没有问题,请尝试

catch( Throwable th )

这是一个坏习惯,虽然。尝试至少在测井它后重新把它(或包装异常)。

这是一个古老的话题 - 但我想增加一个备选答案,因为我达到了同样的问题,打这篇文章后得到它的

由于我不希望更多的依赖关系添加到我的应用程序(=的javax) 我使用的解决方案建议这里得到位图,然后我用的 setImageBitmap 在这种情况下,的抛出:SecurityException 落入

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top