2011-09-18 43 views
2

我正在使用ObjectInputStream和ObjectOutputStream为我的客户端通过TCP与服务器对话。客户端无法收到来自服务器的响应...当我在调试模式下进行时,响应顺利进行。但是,如果我没有中断点运行程序,它会抛出一个NullPointerException异常。Java ObjectInputStream readObject引发NullPointerException

初始化:

  try 
      { 
       oos.writeObject(request); 
       serverResponse = (Message) ois.readObject(); 
       output.append(serverResponse.data + "\n"); 
      } 
      catch(Exception ex) 
      { 
       System.err.println("Error adding car to server: " + ex.getMessage()); 
       return; 
      } 

上面的代码抛出的NullPointerException异常:打破

ObjectOutputStream oos = null; 
ObjectInputStream ois = null; 
Socket socket = null; 

socket = new Socket(server, port); 
oos = new ObjectOutputStream(socket.getOutputStream()); 
oos.flush(); 
ois = new ObjectInputStream(socket.getInputStream()); 

代码。如果我使用了一个中断点并逐步完成,那么我得到的服务器响应就很好。我已确认在每种情况下服务器正在读取

任何帮助将不胜感激!

编辑堆栈跟踪EX:

java.lang.NullPointerException 
    at CarInventoryClient.actionPerformed(CarInventoryClient.java:251) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

你提到'ex是结果为NULL.' ...你确定这就是你的意思(例外是!!)?或者你的意思是'serverResponse变成了NULL .'? – Saket

+0

我不相信'ex'可能为null。我猜你的意思是你的'println()'*打印*“空”,这将是因为没有消息。 –

+0

我已将堆栈跟踪添加到原始帖子。我的意思是消息是空的。它抛出一个NullPointerException ...这是什么意思?我注释掉了output.append行......只是在响应数据为空......没有修复空指针。 – DaveC

回答

1

这是一个竞赛条件。

ois = new ObjectInputStream(socket。的getInputStream());

上面这行代码导致线程阻塞在我的类的构造函数中。 Java的文档声明它会阻塞,直到收到输入头文件。动作处理程序正在发送,然后从服务器接收数据包 - 这会唤醒构造器代码并完成初始化。

当有线程休眠或调试器被连接时,构造函数代码将在数据收到之前完成。但是,在实时执行时,在未阻止的初始化可以完成之前调用readObject。这就是为什么ois被视为无效。

+0

对不起,你到底做了什么改变才能完成这项工作? –

1

我建议你尝试读取输入流之前刷新输出流。

变量ex不应该是null。你能否给我们发生异常的确切路线。

您应该打印整个消息。我怀疑不打印类型和行异常发生没有帮助。如果您有任何消息的getMessage(),则将会返回null

尝试

ex.printStackTrace(); 
+0

我已将堆栈跟踪添加到原始帖子。我的意思是消息是空的。它抛出一个NullPointerException ...这是什么意思? – DaveC

+0

你能告诉我们哪一行是251吗? –

+0

Line 251:serverResponse =(Message)ois.readObject(); – DaveC

1

我觉得这条线的输出可能混淆你:

System.err.println("Error adding car to server: " + ex.getMessage()); 

例外不需要一条消息,这是完全正常的(以及有点不方便),这打印:

Error adding car to server: null 

通过仅打印您在记录关键信息(例如异常类型以及异常堆栈跟踪)时遗漏的异常消息。你最好打电话ex.printStackTrace()。它打印异常的异常类,消息和堆栈跟踪。

1

(以上评论的阐述,对教学的原因。OP已经确认。)

如果你得到一个堆栈跟踪开始与给定的线,这意味着扔就在这行发生- 不在该行中调用的方法中。所以在问题看行:

的唯一途径很行可能会引发NPE是,如果ois为null。

相关问题