A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 希望的曙光 中级黑马   /  2013-1-17 17:03  /  1361 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.net.*;
import java.io.*;
public class recserSever {

        public static void main(String[] args)throws Exception {
        ServerSocket ss=new ServerSocket(3004);
        boolean Rruning =true;
          while(Rruning){
                  Socket s=ss.accept();
                  new Thread(new Servecis(s)).start();
          }
          ss.close();
         }

}
class Servecis implements Runnable{
         Socket s;
         public Servecis(Socket s){
                 this.s=s;
         }
         public void run(){
                 try{
         
                InputStream ips=s.getInputStream();
                 OutputStream ops=s.getOutputStream();
                 BufferedReader bff=new BufferedReader(new InputStreamReader(ips));
                  PrintWriter pw=new PrintWriter(ops);
                  while(true){
                         String str= bff.readLine();
                         if(str.equalsIgnoreCase("bye")){                                break;
                         }
                         String sStr=new StringBuffer(str).reverse().toString();
                         pw.println(sStr);
                  }
                  bff.close();
                  pw.close();
                  s.close();
                 }
                 catch(Exception e){
                         e.printStackTrace();
                 }
                 
        }
}java.lang.NullPointerException
         at heima.cmo.Servecis.run(recserSever.java:31)
         at java.lang.Thread.run(Unknown Source)
大家帮忙看看这段代码有什么不对的地方?为什么我在关闭客户端的时候红色标记的哪一行会出现这样的异常:

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 肖亚光 于 2013-1-17 17:20 编辑

ss.close(); 这个好像没有意义吧

不知道哪行是红色标记  
是不是你这个循环出问题的呢?
                 while(true){
                         String str= bff.readLine();
                         if(str.equalsIgnoreCase("bye")){                                break;
                         }
                         String sStr=new StringBuffer(str).reverse().toString();
                         pw.println(sStr);
                  }
当你客户端关闭的时候
由于while(true) 还是会继续从你的客户端读数据 但是现在客户端已经关闭了s了,或者你的客户端也没有告诉服务端什么时候s.shutdownOutput()的
是不是这个原因呢?
个人意见
回复 使用道具 举报
关闭异常的语句必须放在finally语句中,这一点你就没做到,即使没出异常你的代码也是不合格的。
class Servecis implements Runnable{
     Socket s;
     InputStream ips;
     OutputStream ops;
     BufferedReader bff;
     PrintWriter pw;
     public Servecis(Socket s){
             this.s=s;
     }
     public void run(){
             try{
     
            ips=s.getInputStream();
             ops=s.getOutputStream();
              bff=new BufferedReader(new InputStreamReader(ips));
               pw=new PrintWriter(ops);
              while(true){
                     String str= bff.readLine();
                     if(str.equalsIgnoreCase("bye")){                                break;
                     }
                     String sStr=new StringBuffer(str).reverse().toString();
                     pw.println(sStr);
              }
              
             }
             catch(Exception e){
                     e.printStackTrace();
             }
             finally{
                     try {
                                        bff.close();
                                        pw.close();
                         s.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                 
             }
            
    }

}
我试了并没有异常。你第一段代码的 ss.close();没有什么意义。
去掉就可以了

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
对于上述问题的补充,其实在关闭资源的时候,一般为了提高健壮性,是药判断一下,资源是否为null,不是null的时候在关闭。这样可以减少异常的抛出,避免已经关闭资源了在进行关闭出现的空指针异常。
即if(bff!=null)
       bff.close();所有有需要的关闭的最好都加上这句话。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马