2011-05-10 90 views
2

编辑:我遇到的问题是我使用了错误的套接字。现在已经解决了。Java空指针异常,请帮我理解为什么

嗨,

我正在研究一个包含套接字编程的java聊天客户端。然而,我开始连接时遇到了一个小问题,因为我得到了一个N​​ullPointerException,我不明白为什么!

这是使烦恼代码:

 try { 
      sock = new Socket(host, port); 
      Connection DaUberConnection = new Connection(sock); 
     } catch (UnknownHostException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

用于创建套接字的变量处一流水平的声明,完全如预期运行(我认为)。主机和端口已设置。

Socket sock; 
String host; 
int port; 

据我所知,它是与我在一个空放错了地方扔的地方,但我实在看不出这是怎么挂在一起。

对不起,我的英语不好或nubieness在java :) 这将是黄金,如果有人能解释为什么发生这种情况!

完整的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at clientpackage.Connection.<init>(Connection.java:24) 
at clientpackage.Client$1.actionPerformed(Client.java:91) 
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.AbstractButton.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.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) 
+1

你有没有设置'host'的值?如果不是,那么'host'将为空,并会导致异常 – debracey 2011-05-10 00:38:24

+1

Connection.java的第24行是什么? – 2011-05-10 00:38:34

+0

是的我现在已经为主机设置了一个“localhost”的值。 – Ms01 2011-05-10 00:40:46

回答

1

我认为问题在于您没有构建和部署与您的问题相同的代码。

  • 你说的例外发生在这一行:

    in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    

    ,这意味着,sock必须为空。

  • 但是,这就是从这里称为:

    sock = new Socket(host, port); // 1 
    Connection DaUberConnection = new Connection(sock); // 2 
    

    ,这意味着,sock不能为空...除非别的东西是怎么回事。

如果您正在运行代码确实是为你报道,这些症状的唯一可能的解释是,如果其他线程在两个语句之间的小窗户分配nullsock12)。即使假设其他线程可以更新sock,此事件将只发生“一次在蓝色的月亮”。


回到你的开发环境,保存您正在编辑的所有文件,清理掉所有的“.class”文件,全力打造的,并再次运行你的应用程序了。


我想我看到您的问题... ssock

这是一个很好的例子,说明为什么它是不良的做法为类暴露其状态变量的子类。 sock实例变量应该是private,子类应该使用getter来访问它,并且应该通过构造函数链来初始化它。

得到一些睡眠,然后明天开始修复这个设计缺陷。

+0

这是Connection.java的当前状态:http://pastie.org/private/jec4n2s22c6hm5aj10ts3a – Ms01 2011-05-10 01:07:01

+0

嗯,忘记了我已经扩展客户端连接使得袜子可用。我应该使用的套接字当然是“不是袜子”。对不起,我累了! :d – Ms01 2011-05-10 01:12:22

0

单独线路24

使用

if (sock==null) System.out.println ("Sock is null"); 
else { 
    is = sock.getInputStream(); 
    if (is==null) System.out.println ("inputStream is null"); 
    else isr = InputStreamReader(is); 
} 

,看看哪一个为空。这条线是什么?

Connection DaUberConnection = new Connection(sock); 
+1

'getInputStream()'不能返回null。这没有任何用处。 'sock'为null。 – 2011-05-10 00:57:13

+0

@布莱恩你是对的。读取文档时,如果无法创建流,Socket将抛出IOException异常。我只是假定它返回null。 – Aleadam 2011-05-10 01:03:12