如何捕获java未检查/运行时异常(特别是SecurityException)

如何捕获java未检查/运行时异常(特别是SecurityException),java,exception,runtime,try-catch,unchecked,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 = n

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

有人能建议我如何抓住这个例外吗


谢谢

如果确实从getImage()引发了异常,那么您的代码应该会捕获它。SecurityException是异常。你哪里搞错了。例如,将ImageIcon构造函数放在try下。如果没用,试试看

catch( Throwable th )

不过这是个坏习惯。在记录它之后,至少尝试重新抛出它(或包装异常)。

该异常是由构造函数抛出的,而该构造函数没有包装在Try块中

new ImageIcon(new URL(imageUri))

使用ImageIcon加载图像是sooooo 1998。您需要。

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

任何有关重定向、死链接等的问题现在都得到了妥善处理。

这是一个老话题-但我想添加一个替代答案,因为我在遇到同样的问题并点击本文后得到了它

因为我不想向我的应用程序(=javax)添加更多依赖项
我使用获取位图,然后使用setImageBitmap在本例中捕获了SecurityException

Hi Jonathan,您完全正确-我刚刚通过调试器运行了它。尽管如此,我仍然有同样的问题-未捕获异常-我正在编辑我的代码以反映捕获的新尝试。嗨-事实上是ImageIcon构造函数引发了异常,我已经更新了我的代码以将其包含在捕获中。然而,它仍然没有被捕获!尝试你的建议。嗨-我试着抓住一次性的,但没有用。。。。我仍然得到:2009-10-10 15:29:02301[main]INFO images.ImageData-获取图像:*********.com/images/bg.jpg未捕获错误获取图像:java.lang.SecurityException位于java.lang.SecurityManager.checkPermission(SecurityManager.java:570)位于java.lang.SecurityManager.checkConnect(SecurityManager.java:1086)在……我看不到您编辑的代码有任何问题。尝试调试它。嗨,Kolibri-我发现了问题:异常是由ImageIcon构造函数生成的一个单独线程引发的-因此我无法捕获它。哈,这是一个多么有趣的错误。我从来没有想到ImageIcon构造函数会产生一个新线程。您必须创建一个Thread.UncaughtExceptionHandler来处理未检查的异常。感谢您的建议,因为ImageIcon生成了一个单独的线程,我现在正是这么做的。