【问题标题】:Null point-er exception in Java [duplicate]Java中的空指针异常[重复]
【发布时间】:2014-03-03 06:34:43
【问题描述】:

我在这段代码中有一个奇怪的问题。当我使用第一个 if 条件执行代码时,一切正常且符合预期。但是,当我评论那个 if 语句并使用另一个 if 条件(已经评论过的那个)时,它会给出一个NPE

getUserIP() 和 getPhoneNumber() 都是私有字符串的普通 getter。这两个值都是由普通设置者设置的。 为什么会这样?

public void sendBroadcast(final String broadcast) {
    System.out.println("entered sendBroadcast");

        String fullPeep = broadcast;
        System.out.println("fullPeep: " + fullPeep);
        String array[] = fullPeep.split("<!!>");

        for(User tempUser: friends)
        {
            if(tempUser.getUserIP().equals(this.getUserIP()))
            {
            System.out.println("tempuser:" + tempUser.getPhoneNumber() + " user: " + array[1]);
            //if(tempUser.getPhoneNumber().equals(array[1]))
            //{
                System.out.println("tempuser:" + tempUser.getPhoneNumber() + " user: " + array[1]);
                System.out.println("if statement of broadcast method");

            try {
                DataOutputStream out2 = new DataOutputStream(socket.getOutputStream());
                out2 = tempUser.getUserDataOutputStream();
                out2.writeUTF(fullPeep + "\n");
                out2.flush();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
        //}
    }
}

Exception in thread "Thread-6" java.lang.NullPointerException
at User.sendBroadcast(User.java:180)
at Server$ServerThread.run(Server.java:394)

我弄清楚了导致异常的原因以及 tempUser.getPhoneNumber() 在某些时候返回 null 的原因。

【问题讨论】:

  • System.out.println("tempuser:" +tempUser.getPhoneNumber() + " user: "+array[1] ); 打印什么?
  • 代码的第 180 行是哪一行?
  • 那么 tempUser.getPhoneNumber() 为空。只需检查为什么它没有设置值。我的意思是调试代码。
  • 你检查了每个用户对象吗?其中至少有一个显然有一个空电话号码。

标签: java nullpointerexception dataoutputstream


【解决方案1】:

变化:

if(tempUser.getPhoneNumber().equals(array[1]))

收件人:

if(java.util.Objects.equals(tempUser.getPhoneNumber(), array[1]))

Objects.equals 是 null 安全的,不会介意电话号码为 null 时。

【讨论】:

  • 如果我没记错的话,这只适用于 Java 7。因此,如果您使用的是 java 7+,这是一个不错的选择。为答案 +1。
  • 我正在使用 java 7+,这确实解决了异常,但不幸的是并没有解决我的问题。我仍然无法像 userIP 一样使用电话号码的方法,即使它们是相同的......谢谢。
  • @Toufic 他们不可能是一样的。你要找的要么是空,要么是非空,但与从 fullPeep 拆分的字符串或类似的东西相比,它有额外的空间。
  • @Boann 是的,tempUser.getPhoneNumber() 在某些时候返回 null。与服务器的连接在应用程序中的某个点关闭并再次重新连接,因此有一个额外的 tempUser 带有指向电话号码的空指针。感谢您的帮助。
  • @Toufic 如果要求电话号码永远不会为空,那么在 User 对象的构造函数和/或设置器中强制执行它可能是有意义的。在构造过程中抛出异常将比稍后在不相关的代码中引发奇怪的异常更快地识别问题。
猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2014-02-04
相关资源
最近更新 更多