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