gpt4 book ai didi

Java NullPointerException,请帮我理解为什么

转载 作者:行者123 更新时间:2023-11-30 11:54:01 24 4
gpt4 key购买 nike

编辑: 我遇到的问题是我使用了错误的套接字。现在已经解决了。

你好,

我正在使用 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 在两个语句(12)之间的小窗口中。即使假设其他线程可以更新sock,这个事件也只会“千载难逢”。


返回您的开发环境,保存您正在编辑的所有文件,清除所有“.class”文件,完整构建,然后重新运行您的应用程序。


我想我明白你的问题了……ssock

这很好地说明了为什么类将其状态变量公开给子类是错误的做法。 sock 实例变量应该是 private 并且子类应该使用 getter 来访问它并且应该通过构造函数链来初始化它。

睡一觉,明天开始修复这个设计缺陷。

关于Java NullPointerException,请帮我理解为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com