当前位置:编程学习 > JAVA >>

求高手点拨一个Java程序的“实施与预期不符”的错误原因.

高手,您好:
    我写了一个进行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 Socket Java排错 Java IM Java Swing --------------------编程问答-------------------- 不用搞那么多try catch,把你的那些代码都放到一个try里面去吧。
像你这种异常处理方式,一旦出现错误,是没法找的。

你这些方法既然是直接接受socket对象的,其实完全可以直接把异常往上层throws。 --------------------编程问答-------------------- 31行空指针说明
inputstream = s.getInputStream();这里没获取到输入流啊 --------------------编程问答--------------------
引用
不用搞那么多try catch,把你的那些代码都放到一个try里面去吧。
像你这种异常处理方式,一旦出现错误,是没法找的。

你这些方法既然是直接接受socket对象的,其实完全可以直接把异常往上层throws。

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

    withiter版主,希望得到您的指导:
    弟我如何排查修改代码,能够得到弟我最新的上述代码的实现类的输出结果:
    
    进行对应的“引起连锁错误的Lib类的第21行代码”的“关闭Socket水管”或者“Socket水管引出的流”的close语句,进行查找...?
    弟我已经将主框架中的相关close语句和该登陆业务可能涉及到的类文件中的close语句进行了关闭操作了..
    可是,还是为能够得到“登录功能的完美实现”..
    希望withiter版主不吝赐教.
    谢谢withiter版主!! --------------------编程问答-------------------- 检查下你的s对象获取到没有
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,