为啥我不能在 finally 语句里关闭 Socket?

2016-03-28 17:26:52 +08:00
 Bryan0Z
	try{
		ServerSocket server =  new ServerSocket(6013);
		Socket socket = server.accept();
		PrintWriter writter = new PrintWriter(socket.getOutputStream(), true);
		if(args==null)
			return;
		for(int i = 0; i < args.length; i++){
			writter.println(args[i]);
		}
			
	}
	catch(Exception e){
		e.printStackTrace();
	}
	finally{
		socket.close();
		server.close();
		writter.close();
	}

finally 块里报错了,三个变量都“ cannot be resolved ”,求问为什么~

4461 次点击
所在节点    Java
25 条回复
LedChang
2016-03-28 17:29:06 +08:00
作用域
Bryan0Z
2016-03-28 17:30:11 +08:00
@LedChang 求问应该怎么改 2333
spongebobsun
2016-03-28 17:37:17 +08:00
@Bryan0Z 定义在 try 外面,踹里面 new 出来干活~
SouthernGiaffe
2016-03-28 17:39:25 +08:00
先在 try 语句外部定义 socket, server, writer 并初始化,这样应该可以吧
jint
2016-03-28 17:39:54 +08:00
ServerSocket server =null;
try{..........
Bryan0Z
2016-03-28 17:40:53 +08:00
@spongebobsun
@SouthernGiaffe
@jint
感谢,可以了~
MOsky
2016-03-28 17:46:21 +08:00
用 Java8 可以让代码好看一点

try (ServerSocket server = new ServerSocket(6013);
Socket socket = server.accept();
PrintWriter writter = new PrintWriter(socket.getOutputStream(), true)
){

if(args==null)
return;
for(int i = 0; i < args.length; i++){
writter.println(args[i]);
}

} catch(Exception e){
e.printStackTrace();
}
Bryan0Z
2016-03-28 18:50:29 +08:00
@MOsky 受教了~我去翻翻语法说明
icylogic
2016-03-28 20:59:41 +08:00
最好不要放在外面, java8 之前的 pattern 是在 finally 再 try catch ,因为 close 也会抛异常。

http://www.javapractices.com/topic/TopicAction.do?Id=25
random2case
2016-03-28 21:19:04 +08:00
lz 看一下 这样会不会好一些 https://gist.github.com/anonymous/9c9919234592e95dc366
random2case
2016-03-28 21:21:01 +08:00
怎么排版成了那个了
Bryan0Z
2016-03-28 21:49:01 +08:00
@icylogic 网站收藏了,很有用~
Bryan0Z
2016-03-28 21:50:19 +08:00
@random2case 代码比我的好看多了 2333
random2case
2016-03-28 22:26:55 +08:00
@Bryan0Z 在 《 java 核心技术》上学的 。
random2case
2016-03-28 22:34:20 +08:00
擦 真受够了 gist 了,为啥排版就是有问题,另外上面的那个貌似还是会报错 ,这样就不会了

https://gist.github.com/anonymous/435f29fa27dde3393acb
incompatible
2016-03-28 22:41:37 +08:00
@MOsky
@icylogic

try-with-resource 特性在 Java 7 里就有了
Bryan0Z
2016-03-29 00:40:49 +08:00
@random2case 一直好奇为什么 github 不架提子能上, gist 死活打不开
random2case
2016-03-29 07:52:09 +08:00
@Bryan0Z 估计 github 现在是重点监护状态,间断性丢包~
laibin
2016-03-29 08:39:52 +08:00
if(xx!=null)xx.close();
wohenyingyu01
2016-03-29 09:19:31 +08:00
@incompatible 我怎么记得是 java8 的新特性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX