编辑: 我遇到的问题是我使用了错误的套接字。现在已经解决了。
你好,
我正在使用 java 开发一个小的聊天客户端,其中包括套接字编程。但是,我在启动连接时遇到了一个小问题,因为我收到了一个 NullPointerException,我不明白为什么!
这是制造麻烦的代码:
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;
我知道这与我在某个地方的错误位置抛出一个空值有关,但我真的看不出这是如何卡在一起的。
抱歉我的英语不好或在 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)
最佳答案
我认为问题在于您没有构建和部署问题中的相同代码。
你说异常发生在这一行:
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
这意味着
sock
必须为空。但这是从这里调用的:
sock = new Socket(host, port); // 1 Connection DaUberConnection = new Connection(sock); // 2
这意味着
sock
不能为 null ... 除非发生其他事情。
如果您正在运行的代码真的是如您所报告的那样,那么对这些症状的唯一可能解释是其他线程正在将 null
分配给 sock
在两个语句(1
和 2
)之间的小窗口中。即使假设其他线程可以更新sock
,这个事件也只会“千载难逢”。
返回您的开发环境,保存您正在编辑的所有文件,清除所有“.class”文件,完整构建,然后重新运行您的应用程序。
我想我明白你的问题了……s
与 sock
。
这很好地说明了为什么类将其状态变量公开给子类是错误的做法。 sock
实例变量应该是 private
并且子类应该使用 getter 来访问它并且应该通过构造函数链来初始化它。
睡一觉,明天开始修复这个设计缺陷。
关于Java NullPointerException,请帮我理解为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943950/