V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Bryan0Z
V2EX  ›  Java

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

  •  
  •   Bryan0Z · 2016-03-28 17:26:52 +08:00 · 4456 次点击
    这是一个创建于 3162 天前的主题,其中的信息可能已经有所发展或是发生改变。
    	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 ”,求问为什么~

    25 条回复    2016-04-05 18:22:15 +08:00
    LedChang
        1
    LedChang  
       2016-03-28 17:29:06 +08:00
    作用域
    Bryan0Z
        2
    Bryan0Z  
    OP
       2016-03-28 17:30:11 +08:00 via Android
    @LedChang 求问应该怎么改 2333
    spongebobsun
        3
    spongebobsun  
       2016-03-28 17:37:17 +08:00
    @Bryan0Z 定义在 try 外面,踹里面 new 出来干活~
    SouthernGiaffe
        4
    SouthernGiaffe  
       2016-03-28 17:39:25 +08:00
    先在 try 语句外部定义 socket, server, writer 并初始化,这样应该可以吧
    jint
        5
    jint  
       2016-03-28 17:39:54 +08:00 via Android
    ServerSocket server =null;
    try{..........
    Bryan0Z
        6
    Bryan0Z  
    OP
       2016-03-28 17:40:53 +08:00
    @spongebobsun
    @SouthernGiaffe
    @jint
    感谢,可以了~
    MOsky
        7
    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
        8
    Bryan0Z  
    OP
       2016-03-28 18:50:29 +08:00 via Android
    @MOsky 受教了~我去翻翻语法说明
    icylogic
        9
    icylogic  
       2016-03-28 20:59:41 +08:00   ❤️ 2
    最好不要放在外面, java8 之前的 pattern 是在 finally 再 try catch ,因为 close 也会抛异常。

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

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

    try-with-resource 特性在 Java 7 里就有了
    Bryan0Z
        17
    Bryan0Z  
    OP
       2016-03-29 00:40:49 +08:00 via Android
    @random2case 一直好奇为什么 github 不架提子能上, gist 死活打不开
    random2case
        18
    random2case  
       2016-03-29 07:52:09 +08:00
    @Bryan0Z 估计 github 现在是重点监护状态,间断性丢包~
    laibin
        19
    laibin  
       2016-03-29 08:39:52 +08:00
    if(xx!=null)xx.close();
    wohenyingyu01
        20
    wohenyingyu01  
       2016-03-29 09:19:31 +08:00
    @incompatible 我怎么记得是 java8 的新特性
    Bryan0Z
        21
    Bryan0Z  
    OP
       2016-03-29 09:40:37 +08:00 via Android
    @wohenyingyu01 确实是 Java7 的
    wohenyingyu01
        22
    wohenyingyu01  
       2016-03-29 10:04:29 +08:00
    @Bryan0Z 哦哦好吧
    theoractice
        23
    theoractice  
       2016-03-29 21:38:15 +08:00
    还是 c#爽啊, using 块优雅解决问题
    Bryan0Z
        24
    Bryan0Z  
    OP
       2016-03-29 23:13:53 +08:00 via Android
    @theoractice 至今没有点这个技能树,看来需要学习一下了
    zcqshine
        25
    zcqshine  
       2016-04-05 18:22:15 +08:00
    @theoractice java7 里的 try-with-source 一样 happy 啊, 不需要 try-catch-finally 了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2707 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:15 · PVG 18:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.