gpt4 book ai didi

java - 当我们关闭一个资源时,用它实例化的对象是否会被破坏?

转载 作者:行者123 更新时间:2023-12-01 04:15:21 27 4
gpt4 key购买 nike

我的疑问主要出现在读取套接字时,在以下代码中:

 String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);

try (
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out =
new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}

链接:http://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoClient.java

在上面的代码中,据我了解,PrintWriter和BufferedReader是资源,但是我也在trywithreasources block 中读取,一旦结束,其中的所有资源都将被关闭。但是,如果关闭资源意味着对象的销毁,则意味着 stdIn 和 in 被销毁,并且它是 block 之外的单独实例。是这样吗?

最佳答案

try-with-resource 语句只会关闭 try 内部括号中声明的资源。

 try ( /*anything declared here will be closed*/) {


}

当尝试结束时,对资源的尝试将在声明的任何资源上调用close()。这并不一定像 C 中的析构函数那样“销毁”对象,但它经常以这种方式使用。该变量也会超出 try 之外的范围,因此可以被垃圾收集。

在您的示例中,stdIn 包装了 System.in,因此 System.in 将被关闭。然而,由于尝试后它仍在范围内,因此不会被垃圾收集。 (但你不能再写信了)

Try-with-resource 只是“语法糖”,将被编译成如下所示:

    Socket echoSocket =null
PrintWriter out =null
BufferedReader in =null
BufferedReader stdIn =null
try{


echoSocket = new Socket(hostName, portNumber);
out =
new PrintWriter(echoSocket.getOutputStream(), true);
in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
stdIn =
new BufferedReader(
new InputStreamReader(System.in));

String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
}finally{
if(stdIn !=null){
try{
stdIn.close()
}catch(Exception e){
//surpress exception if needed
}
}
if(in !=null){
try{
in.close()
}catch(Exception e){
//surpress exception
}
}
if(out !=null){
try{
out.close()
}catch(Exception e){
//surpress exception
}
}
if(echoSocket !=null){
try{
echoSocket.close()
}catch(Exception e){
//surpress exception
}
}
}

请注意,资源以相反的顺序关闭,以解决嵌套问题。如果某些东西在 try block 中引发了异常,并且其他东西在 finally block 中引发了异常,则“抑制异常”将被添加到原始 Exception 对象中,该对象可以通过新的 Throwable.getSuppressed()方法。这样堆栈跟踪就可以正确显示 try 中引发的原始异常。

有关 try-with-resource 的更多信息,请参阅 Oracle 的教程:http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

关于java - 当我们关闭一个资源时,用它实例化的对象是否会被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com