Java NullPointerException,请帮我理解为什么

标签 java nullpointerexception

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

你好,

我正在使用 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/

相关文章:

java - 为什么我在战舰游戏中收到错误 java.lang.NullPointerException?

java - 从 JSON 检索数据时出现 NullPointer 异常

java - Oozie安装使Mojo异常出现onerror。 oozie版本4.2.0

java - Netbeans 在保存时部署 : how is it supposed to work?

java - 无法为连接 URL '' 创建类 'null' 的 JDBC 驱动程序

java - 使用Sheevaplug作为基础服务器运行tomcat和Mysql

java - JRXML 中的多个页面使用 iReport 进行多页报告

java - 使用 Apache CXF 生成 Web 服务时出现 NullPointerException

java - Ejb不会初始化实体管理器

java - 在 GridLayout 中交换组件时出现 IndexOutOfBoundException 和 NullPointerException?