4

NullPointerException尝试识别序列化对象是否可用并使用套接字接收它时出错。如何识别是否ObjectInputStream有可用对象?首先,我尝试阅读文本,然后尝试从可能不存在的同一个套接字 Lot 对象()中读取。

        public class ThreadIn extends Thread{
        BufferedReader in;
            PrintStream outConsole;
            Socket socket;
            ObjectInputStream ois;
            String str;
            Lot lot;
ThreadIn(BufferedReader input, PrintStream inOutput, Socket s){
        str = "";
        in= input;
        socket= s;
        try {
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        outConsole = inOutput;

    }
    public void run() {

            while(!EXIT_THREAD){
            try {
        if(in.ready()){
            try {
                str= in.readLine();
                    Thread.sleep(100);
                } catch (IOException e) {
                EXIT_THREAD= true;
                break;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                outConsole.println("Received:"+str);

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            try {
                if((Lot)ois.readObject() != null){      
                    lot = (Lot)ois.readObject(); 
                    if (lot!=null){outConsole.println(lot.toString());} 
                    outConsole.println((String)ois.readObject());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    }
4

2 回答 2

3
if((Lot)ois.readObject() != null)

这部分本身从 Socket 读取对象。因此,您在代码中从 Socket 读取对象的 3 倍。如果您只有一个或多个对象进入套接字,您可以读取该对象并捕获异常!。就像下面一样

 //..loop start
         try {
                lot = (Lot)ois.readObject(); 
             }
         catch (Exception e) 
           { 
//      do some handling, skip the object! put a continue: or something

            }
    //do what ever you want to do with `lot`

    //..loop end

现在,根据您的代码,您还没有初始化您的ObjectInputStream对象。

做一个ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

如果您在这里省略了代码,那是我的错误,否则请也初始化套接字!

于 2012-06-05T06:29:57.210 回答
1

根据其他答案,包括已删除的答案,您调用readObject()了两次并丢弃了第一个结果。您应该重新组织您的代码,以便它可以阻止readObject().

你还有其他问题。您正在测试readObject()for的结果null?,但仅当您在发件人处null写了 a时才会返回。null我怀疑您将其用作 EOS 测试,但它是无效的。readObject()向 EOS投掷EOFException。您应该重新组织您的代码,以便它可以阻止readObject().

于 2012-06-05T08:00:19.710 回答