【问题标题】:NullPointerException when Creating an Array of objects [duplicate]创建对象数组时出现 NullPointerException [重复]
【发布时间】:2010-12-27 17:14:21
【问题描述】:

我一直在尝试创建一个包含两个值的类的数组,但是当我尝试将一个值应用于数组时,我得到了 NullPointerException。

public class ResultList {
    public String name;
    public Object value;
}

public class Test {
    public static void main(String[] args){
        ResultList[] boll = new ResultList[5];
        boll[0].name = "iiii";
    }
}

为什么会出现此异常,如何解决?

【问题讨论】:

  • 将 ResultList 重命名为 NameValuePair 可能会更清晰一些。
  • 你知道绑定键/值的类已经存在吗?例如 Map 的实现。
  • 一个来自 C++ 的常见问题,新数组是一个引用数组,但没有创建实际对象。您必须将它们创建为单独的步骤。 Java 不允许像 C++ 那样使用对象数组。

标签: java arrays nullpointerexception


【解决方案1】:

您创建了数组,但没有在其中放入任何内容,因此您有一个包含 5 个元素的数组,所有元素都为空。你可以添加

boll[0] = new ResultList();

在设置 boll[0].name 的行之前。

【讨论】:

  • 通过实例化,您将拥有一个 5 元素数组,其中包含:{null, null, null, null, null}。
【解决方案2】:
ResultList[] boll = new ResultList[5];

创建一个 size=5 的数组,但不创建数组元素。

你必须实例化每个元素。

for(int i=0; i< boll.length;i++)
    boll[i] = new ResultList();

【讨论】:

    【解决方案3】:

    正如许多人在之前的答案中所说,ResultList[] boll = new ResultList[5]; 只是创建一个大小为 5 的 ResultList 数组,其中所有元素都为空。当您使用boll[0].name 时,您正在尝试执行类似null.name 的操作,这就是Nul​​lPointerException 的原因。使用以下代码:

    public class Test {
        public static void main(String[] args){
            ResultList[] boll = new ResultList[5];
    
            for (int i = 0; i < boll.length; i++) {
                boll[i] = new ResultList();
            }
    
            boll[0].name = "iiii";
       } 
    }
    

    这里的for循环基本上用ResultList对象初始化数组中的每个元素,一旦for循环完成,就可以使用

    boll[0].name = "iiii";
    

    【讨论】:

      【解决方案4】:

      我想通过调用

      ResultList[] boll = new ResultList[5];
      

      您创建了一个可以容纳 5 个 ResultList 的数组,但您必须先初始化 boll[0],然后才能设置值。

      boll[0] = new ResultList();
      

      【讨论】:

        【解决方案5】:
        ResultList p[] = new ResultList[2];
        

        通过编写此代码,您只需为包含 2 个元素的数组分配空间。 您应该通过这样做来初始化引用变量:

        for(int i = 0; i < 2; i++){
            p[i] = new ResultList();
         }
        

        【讨论】:

          【解决方案6】:

          此外,您可以通过在类中添加调试行来证明这一点,例如:

          public class ResultList {
              public String name;
              public Object value;
          
              public ResultList() {
                  System.out.println("Creating Class ResultList");
              }
          }
          

          无论何时创建一个对象,都必须调用其构造函数之一(如果没有构造函数,则会自动创建一个默认构造函数,类似于您在类中已有的构造函数)。如果您只有一个构造函数,那么创建对象的唯一方法就是调用该构造函数。如果行

          ResultList[] boll = new ResultList[5]; 
          

          确实创建了 5 个新对象,您会看到您的调试行出现在控制台上 5 次。如果没有,你就知道构造函数没有被调用。另请注意,上面的行没有带有左括号和右括号“()”的参数列表,因此它不是函数调用 - 或构造函数调用。相反,我们只指类型。我们说:“我需要一个 ResultList 对象数组的空间,总共最多 5 个。”在此行之后,您所拥有的只是空白空间,而不是对象。

          当您尝试各种修复时,调试行将帮助您确认您得到了想要的结果。

          【讨论】:

            【解决方案7】:
            class ResultList {
                public String name;
                public Object value;
                public ResultList() {}
            }
             public class Test {
                public static void main(String[] args){
                ResultList[] boll = new ResultList[5];
                boll[0] = new ResultList(); //assign the ResultList objet to that index
                boll[0].name = "iiii";  
               System.out.println(boll[0].name);
               }
             }
            

            直到您创建了 ResultSet 对象,但每个索引都是空的,指向 null 引用,这就是您获得 null 的原因。 所以只需在该索引上分配对象,然后设置值。

            【讨论】:

              【解决方案8】:

              首先,您创建了 5 个 ResultList 类型的元素,但是在插入值时,您插入的名称和值是错误的。您可以使用构造函数来创建数组元素并将值插入。

              class ResultList {
                  public String name;
                  public Object value;
                  public ResultList(String name,Object value){
                      this.name = name;
                      this.value = value;
                      System.out.println(name+" --- "+value);
                  }
              }
              public static void main(String[] args) {
                      ResultList[] boll = new ResultList[5];
                      boll[0] = new ResultList("myName","myValue");
                  }
              

              【讨论】:

                【解决方案9】:

                您可以尝试这种情况,也可以在 ResultList 类中将变量“名称”设为静态。所以当 ResultList[] boll = new ResultList[5];在那个时候被执行,该类中的所有变量都将被赋值

                public static void main(String[] args){
                         ResultList[] boll = new ResultList[5];
                    boll[0] = new ResultList();
                    boll[0].name = "iiii";
                
                    System.out.println(boll[0].name);
                    }
                
                
                public class ResultList {
                
                    public  static String name;
                    public  Object value;
                
                    public ResultList() {}
                }
                

                【讨论】:

                • 您可以尝试上述方案,也可以在 ResultList 类中将变量“名称”设为静态。所以当 ResultList[] boll = new ResultList[5];在那个时候被执行,该类中的所有变量都将被赋值
                • 您能解释一下您是如何解决这个问题的吗?
                • 这已在多个答案中提出。
                • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
                • @Mamun 确实如此。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-01-30
                • 2020-07-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多