Bryan0Z
V2EX  ›  Java

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

  •  
  •   Bryan0Z · Mar 28, 2016 · 5859 views
    This topic created in 3872 days ago, the information mentioned may be changed or developed.
    	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 replies  •  2016-04-05 18:22:15 +08:00
    LedChang
    LedChang
    Mar 28, 2016
    1
    作用域
    Bryan0Z
    Bryan0Z
    OP
    Mar 28, 2016 via Android
    2
    @LedChang 求问应该怎么改 2333
    spongebobsun
    spongebobsun
    Mar 28, 2016
    3
    @Bryan0Z 定义在 try 外面,踹里面 new 出来干活~
    SouthernGiaffe
    SouthernGiaffe
    Mar 28, 2016
    4
    先在 try 语句外部定义 socket, server, writer 并初始化,这样应该可以吧
    jint
    jint
    Mar 28, 2016 via Android
    5
    ServerSocket server =null;
    try{..........
    Bryan0Z
    Bryan0Z
    OP
    Mar 28, 2016
    6
    @spongebobsun
    @SouthernGiaffe
    @jint
    感谢,可以了~
    MOsky
    MOsky
    Mar 28, 2016
    7
    用 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
    Bryan0Z
    OP
    Mar 28, 2016 via Android
    8
    @MOsky 受教了~我去翻翻语法说明
    icylogic
    icylogic
    Mar 28, 2016❤️2
    9
    最好不要放在外面, java8 之前的 pattern 是在 finally 再 try catch ,因为 close 也会抛异常。

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

    https://gist.github.com/anonymous/435f29fa27dde3393acb
    incompatible
    incompatible
    Mar 28, 2016
    16
    @MOsky
    @icylogic

    try-with-resource 特性在 Java 7 里就有了
    Bryan0Z
    Bryan0Z
    OP
    Mar 29, 2016 via Android
    17
    @random2case 一直好奇为什么 github 不架提子能上, gist 死活打不开
    random2case
    random2case
    Mar 29, 2016
    18
    @Bryan0Z 估计 github 现在是重点监护状态,间断性丢包~
    laibin
    laibin
    Mar 29, 2016
    19
    if(xx!=null)xx.close();
    wohenyingyu01
    wohenyingyu01
    Mar 29, 2016
    20
    @incompatible 我怎么记得是 java8 的新特性
    Bryan0Z
    Bryan0Z
    OP
    Mar 29, 2016 via Android
    21
    @wohenyingyu01 确实是 Java7 的
    wohenyingyu01
    wohenyingyu01
    Mar 29, 2016
    22
    @Bryan0Z 哦哦好吧
    theoractice
    theoractice
    Mar 29, 2016
    23
    还是 c#爽啊, using 块优雅解决问题
    Bryan0Z
    Bryan0Z
    OP
    Mar 29, 2016 via Android
    24
    @theoractice 至今没有点这个技能树,看来需要学习一下了
    zcqshine
    zcqshine
    Apr 5, 2016
    25
    @theoractice java7 里的 try-with-source 一样 happy 啊, 不需要 try-catch-finally 了...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1314 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    ♥ Do have faith in what you're doing.