代码之家  ›  专栏  ›  技术社区  ›  Richard H

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

  •  1
  • Richard H  · 技术社区  · 16 年前

    我有一个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 回复  |  直到 10 年前
        1
  •  1
  •   Jonathan Feinberg    16 年前

    构造函数正在引发异常,该异常未包装在try块中。

    new ImageIcon(new URL(imageUri))
    
        2
  •  1
  •   Jonathan Feinberg    16 年前

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

        3
  •  0
  •   Vladimir Dyuzhev    16 年前

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

    catch( Throwable th )
    

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

        4
  •  0
  •   Richard H    16 年前

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

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

        5
  •  0
  •   Community CDub    8 年前

    这是一条古老的线索——但是我想添加一个替代答案,因为我在遇到同样的问题并点击了这个帖子之后得到了它。

    因为我不想在我的应用程序中添加更多的依赖项(=javax) 我用过 solution suggested here 获取位图,然后使用 SETIMAGE位图 在这种情况下, 安全例外 被抓住