为什么我不能在我的servlet中尝试使用资源?

时间:2017-02-10 04:18:46

标签: java servlets try-catch

我有一个JEE 7 servlet,它将网络摄像头的图片发送到用户的浏览器。如果相机已开启,一切正常并且图像已发送。如果相机关闭,我自己的" DeviceUnavailableException"被扔了。然后,servlet发送一个替代图像,指示摄像机处于关闭状态 - 一种友好的可视错误消息。这是代码: -

 protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    try {
        ServletOutputStream os = response.getOutputStream();    // Cannot use try-with-resources here!
        Camera camera = new Camera(ip, username, password);
        byte[] vImage = camera.getEntropy();
        response.setContentType("image/jpeg");
        System.out.println("Sending visualisation...");
        os.write(vImage);
        os.close();
    } catch (DeviceUnavailableException e) {
        System.err.println(e);
        try (InputStream is = PhotonicSignalVisualisation.class
                .getResourceAsStream("unavailable.png");
                ServletOutputStream os = response.getOutputStream()) {
            byte[] uImage = new byte[623];    // need to know exact file size of wait.png
            is.read(uImage);
            response.setContentType("image/png");
            System.out.println("Sending unavailable image...");
            os.write(uImage);
        } catch (IOException ex) {
            System.err.println("No luck sending device unavailable image");
            System.err.println(e);
        }
    } catch (IOException e) {
        System.err.println(e);
    }
}

此代码有效。

奇怪的是,虽然我可以在DeviceUnavailableException catch块中使用try-with-resources(TWR)语句,但我不能在顶部的try块中。 NetBeans建议我转换为TWR,但是当我这样做时,没有图像返回到浏览器。似乎os.write(uImage)已执行,但已发送到其他地方,而不是发送到浏览器!

我可能已向后接近这一点,但我无法理解这里的TWR问题。有没有更好的方法来处理友好的错误情况?当相机关闭时,我试图避免浏览器上的简单破损图像。

1 个答案:

答案 0 :(得分:-2)

TWR块内的所有类都应该实现AutoCloseable接口。

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

  

try-with-resources语句确保关闭每个资源   在声明的最后。任何实现的对象   java.lang.AutoCloseable,包含所有实现的对象   java.io.Closeable,可以用作资源。

解决方案:让您的Camera类实现AutoCloseable。