对象输入流类强制转换异常 - 即使它不应该发生

时间:2012-07-20 16:32:35

标签: java sockets networking

我有一个奇怪的问题。我试图用聊天选项编写简单的客户端 - 服务器应用程序,但我遇到了一个问题 - 对象输入流读取错误的类。错误是:

Exception in thread "Thread-4" java.lang.ClassCastException: org.oxomoco.packets.PacketAlive cannot be cast to org.oxomoco.packets.PacketMessage
at org.oxomoco.server.SocketConnectionServer.run(SocketConnectionServer.java:52)
at java.lang.Thread.run(Unknown Source)

它发生在这里:

 PacketMessage pm = (PacketMessage)ois.readObject();

循环中的内容如下所示:

            while(true){




            //if(ois.readObject() instanceof PacketMessage){


            //  pm = (PacketMessage)ois.readObject();
            //  se.println(ois.readObject().toString());
            //}



            if((ois.readObject() instanceof PacketMessage)==true){
                System.out.println("It is: " + (ois.readObject() instanceof PacketMessage));

                PacketMessage pm = (PacketMessage)ois.readObject();

                se.acprintln(">>",uname + ": " +pm.getMsg());

            }
            if((ois.readObject() instanceof PacketAlive)==true){
                System.out.println("-it is: " + (ois.readObject() instanceof PacketAlive));
                PacketAlive pa = (PacketAlive)ois.readObject();
            }

    }

不知何故 - 即使我检查实例 - 对象输入流是PacketMessage的实例,它应该是PacketAlive的实例。有没有人知道为什么,当然 - 如何解决它?

2 个答案:

答案 0 :(得分:5)

您正在执行

ois.readObject()

几次,并且每次获得一个不同的对象(不同的类?)readObject() 从流中提取每个对象,而不是将其留在那里。

相反,读取它,分配给变量然后执行测试等,例如

while (true) {
   Object obj = ois.readObject();
   // do something with obj...

答案 1 :(得分:3)

尝试将ois.readObject()的返回值赋给变量,而不是将其调用两次。

每次调用readObject时,都会从流中消耗更多的字节,每次都不会返回相同的对象。