2009-10-10 123 views
1

我有java类与从网站获取图像的方法:如何捕捉一个java选中/运行时异常(特别是抛出:SecurityException)

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

任何人都可以建议我怎么会发现这个异常?

感谢

+0

我用setImageBitmap看到您的编辑代码没有问题。尝试通过它进行调试。 – Kolibri 2009-10-10 14:39:21

+0

您好Kolibri - 我发现了这个问题:异常是由一个单独的线程引发的ImageIcon构造函数产生 - 因此我无法捕捉它。 – 2009-10-10 14:46:03

+0

哈,多么有趣的错误。我永远不会猜到ImageIcon构造函数会产生一个新的线程。你将不得不做一个Thread.UncaughtExceptionHandler来处理这个未经检查的异常。 – Kolibri 2009-10-10 15:33:41

回答

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

任何问题重定向,死链接等正在办理正常。

0

如果从的getImage的确抛出的异常(),您的代码应该抓住它。 SecurityException是异常。你在某个地方弄错了。例如,将ImageIcon构造函数放在try下。如果没有帮助,试试

catch(Throwable th) 

虽然这是一个坏习惯。记录后至少要重新抛出它(或包装异常)。

+0

嗨 - 实际上是ImageIcon构造函数抛出异常,我已经更新了我的代码,将它包含在catch中。但是 - 它仍然没有被发现!尝试你的建议。 – 2009-10-10 14:24:36

+0

嗨 - 我试图捕捉Throwable,但无济于事......我仍然得到: 2009-10-10 15:29:02,301 [main] INFO images.ImageData - 获取图像:http://www.* ****** COM /图像/ bg.jpg 未被捕获的错误获取图像: java.lang.SecurityException异常 \t在java.lang.SecurityManager.checkPermission(SecurityManager.java:570) \t在java.lang中。 SecurityManager.checkConnect(SecurityManager.java:1086) \t在..... – 2009-10-10 14:30:29

1

构造函数抛出异常,该构造函数未包含在try块中。

new ImageIcon(new URL(imageUri)) 
+0

嗨乔纳森,你是绝对正确的 - 我只是通过调试器运行它。尽管如此,我仍然遇到了同样的问题 - 异常没有被捕获 - 编辑我的代码以反映新的尝试。 – 2009-10-10 14:22:08

1

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

+0

感谢您的建议,由于ImageIcon产生了一个单独的线程,我现在正在做这个。 – 2009-10-11 14:22:55

0

这是一个古老的线程 - 但我想添加一个替代答案,因为我得到它后,达到相同的问题,并打这个帖子。

因为我不想更多的依赖关系添加到我的应用程序(=的javax) 我用solution suggested here得到位图,然后我在这种情况下抛出:SecurityException被捉住