高手,您好:
    我写了一个进行Socket通信数据接收的Lib类的readsocketUTF()方法,源代码如下:
    package c_port_packageBJDoctor;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;public class Lib {
static String MyKey = "CJ加油2";
    static InputStream inputstream = null;
    static OutputStream outputstream = null;
    
static String readsocketUTF(Socket s){
System.out.println(s);
        String info = "";
        while(true){ 
        byte[] buf = new byte[2048*512]; 
int num = 0;
try {
inputstream = s.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

while   (num   !=   (-1))   {//是否读完所有数据   
        synchronized(s){
System.out.println(inputstream);
try {
num   =   inputstream.read(buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}   
String buffer0 = null;
try {
buffer0 = new String(buf,"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
info = buffer0.trim();
String infomation = Systemcrypt.HloveyRC4(info, MyKey);
try {
inputstream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
        return infomation;
        } 
    }

static void write(Socket s,String str0){
String str = Systemcrypt.HloveyRC4(str0, MyKey);
try {
outputstream = s.getOutputStream();
byte[] b = str.getBytes("UTF-8");
int len = b.length;
outputstream.write(b,0,len);
outputstream.flush();
outputstream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}    但是每次调用它的时候,我的编译器都报出:
    第31行代码有“空指针异常”..
    并且,在我的这个Lib类参与系统的运算的时候,产生了:
    第21行的“Socket is closed”的异常问题..
    经过在这个地址:
    http://tieba.baidu.com/p/2053358639
    的了解,我知道了“出现Socket is closed”的异常的原因是由于:
    关闭了流,或者Socket对象.
    现在我已经将我的S端的服务器的相关类的源代码中的流和Socket对象的关闭语句,全部取消了..
    但是,还是报出上面的错误..
    希望得到高手的点拨:
    问题,可能出在什么地方...?
    Java调试Java SocketJava排错Java IMJava Swing

解决方案 »

  1.   

    不用搞那么多try catch,把你的那些代码都放到一个try里面去吧。
    像你这种异常处理方式,一旦出现错误,是没法找的。你这些方法既然是直接接受socket对象的,其实完全可以直接把异常往上层throws。
      

  2.   

    31行空指针说明
    inputstream = s.getInputStream();这里没获取到输入流啊
      

  3.   

    请问rumlee哥:
        为什么我的这种异常处理方式,一旦出现错误,会有“是没法找的。”呢...?
        进行了“一个try语句”的书写的话,我认为:
        会有:
        整个代码,会让更多的不需要进行“捕捉异常的语句被监视”而导致“程序的效率降低”的缺点出现吧...?
        并且,在整个代码中,如果我进行了“面向每一个catch语句的"不同内容的输出处理,例如:System.out.println("line24");System.out.println("line34");System.out.println("line51");System.out.println("line68");”的代码添加的话,我应该能够获得:
        准确定位错误,的代码功能的实现的效果吧..?
        谢谢rummlee哥!!
      

  4.   

        withiter版主,希望得到您的指导:
        弟我如何排查修改代码,能够得到弟我最新的上述代码的实现类的输出结果:
        
        进行对应的“引起连锁错误的Lib类的第21行代码”的“关闭Socket水管”或者“Socket水管引出的流”的close语句,进行查找...?
        弟我已经将主框架中的相关close语句和该登陆业务可能涉及到的类文件中的close语句进行了关闭操作了..
        可是,还是为能够得到“登录功能的完美实现”..
        希望withiter版主不吝赐教.
        谢谢withiter版主!!