如何识别ObjectInputStream是否有可用对象?

时间:2012-06-05 06:14:15

标签: java sockets serialization

在尝试识别序列化对象是否可用时获取错误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();
                    }
    }

2 个答案:

答案 0 :(得分:2)

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

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

 //..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());

如果你在这里省略了代码,那么我的错误,否则请同时初始化套接字!

答案 1 :(得分:1)

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

你还有其他问题。您正在测试readObject() null?的结果,但如果您在发件人处写了null,则只返回null。我怀疑你使用它作为EOS测试,但它无效。 readObject()在EOS上抛出EOFException。您应该重新组织代码,以便它可以阻止readObject()