Java 我对嵌套try with resource的使用是否正确?

Java 我对嵌套try with resource的使用是否正确?,java,Java,我有一个简单的TCP服务器,它打印客户端发送的消息。我正在尝试修改它以使用资源试用功能。在我的示例中使用嵌套的try with resource语句是否正确 public static void main(String args[]) throws IOException { String receivedMessage; try (ServerSocket serverSocket = new ServerSocket(777)) { while (true)

我有一个简单的TCP服务器,它打印客户端发送的消息。我正在尝试修改它以使用资源试用功能。在我的示例中使用嵌套的try with resource语句是否正确

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

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

使用资源的try
try
块可以独立,因为它有一个隐式的
finally
块;而传统的
try
块后面必须跟一个
catch
块和/或一个
finally

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

我会建议您将这两个资源放在同一个try块中,除非您的情况不起作用,因为在请求其
inputStream()
之前需要调用serverSocket上的
accept()

但是,在您的代码示例中仍然有一个适当的机会,可以在第二次使用资源时放置多个资源:

try (Reader stream = new InputStreamReader(socket.getInputStream());
     BufferedReader in = new BufferedReader(stream)) {
  // do stuff, still preferring to use 'in' here rather than 'stream'
}

你怎么会认为不是呢?谷歌搜索让我想到了。一些用户建议在try子句中放置两个用分号分隔的语句。就我而言,它不起作用。我只是想知道使用嵌套的try with resource子句或其他有效的解决方案是否是一种好的做法。您不能将两者都放在一个try块中,因为第二个try块中的
socket.getInputStream()
取决于
socket socket=serverSocket.accept()发生在第一个try块中。我用一个示例更新了我的答案,说明您的代码可以在try子句中适当地使用多个资源。有关链接资源的建议,请参阅
try(BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()))
serverSocket=新的serverSocket(777)
应该放在try子句中,打开它们时也可能发生io异常,读卡器代码也是如此。
try (Reader stream = new InputStreamReader(socket.getInputStream());
     BufferedReader in = new BufferedReader(stream)) {
  // do stuff, still preferring to use 'in' here rather than 'stream'
}