我有一个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问题。有没有更好的方法来处理友好的错误情况?当相机关闭时,我试图避免浏览器上的简单破损图像。
答案 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。