当前位置: 首页 > 知识库问答 >
问题:

我使用嵌套的try-with-resource是正确的吗?

空俊语
2023-03-14
public static void main(String args[]) throws IOException {
    String receivedMessage;

    try (ServerSocket serverSocket = new ServerSocket(777)) {
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("Client connected");
            try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                while ((receivedMessage = in.readLine()) != null) {
                    System.out.println(receivedMessage);
                }
                System.out.println("Client disconnected");
            }
        }
    }
}

共有1个答案

满玉泽
2023-03-14

是的,你的例子是正确的。

try-with-resourcestry块可以独立存在,因为它有一个隐式finally块;而传统的try块后面必须跟着catch块和/或finally块。

因此,您的示例代码等效于以下内容(除了资源变量在各自的try块范围之外是可见的之外):

        final ServerSocket serverSocket = new ServerSocket(777);
        try {
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("Client connected");
                final BufferedReader in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                try {
                    while ((receivedMessage = in.readLine()) != null) {
                        System.out.println(receivedMessage);
                    }
                    System.out.println("Client disconnected");
                } finally {
                    in.close();
                }
            }
        } finally {
            serverSocket.close();
        }
try (Reader stream = new InputStreamReader(socket.getInputStream());
     BufferedReader in = new BufferedReader(stream)) {
  // do stuff, still preferring to use 'in' here rather than 'stream'
}
 类似资料:
  • 我已经使用try with资源重写了一个Play2/JDBC查询,但我不确定这是否正确。第一个try块处理Connection和准备语句。第二次尝试处理ResultSet。 理论上连接,语句和结果集在任何情况下都会被正确关闭?是这样吗?还是我错过了需要处理的东西? -- 向捕获块添加了日志记录。

  • 本文向大家介绍什么是Java中的try-with-resource?,包括了什么是Java中的try-with-resource?的使用技巧和注意事项,需要的朋友参考一下 每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。 从JSE7开始,引入了try-with-resources语句。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在

  • 本文向大家介绍Java try-with-resource语法使用解析,包括了Java try-with-resource语法使用解析的使用技巧和注意事项,需要的朋友参考一下 背景 众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。 在Java的江湖中,存在着一种名为finally的功夫,它可以保证

  • 假设我使用的是一个文档不完整的第三方库,它没有源代码。库的方法之一接受来加载各种数据。 不幸的是,Java规范(据我所知)没有提到如果在try-with-resource中手动关闭资源会发生什么。有没有人碰巧知道?

  • 下面是: 下面是 为了简单起见,我使用了H2数据库,因为它是一个基于文件的数据库,很容易创建和测试。