有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么在循环中的数组中分配引用后会出现NullPointerException?

这不起作用的原因:

//...
Integer[] array=new Integer[5];
for(Integer x: array){x=-1;}
printArray(array);
//...

// the print function is the following
public static String printArray(Object[] array){
    String str="";
    for(Object obj : array){
         str+=obj.toString()+" ,";
    }
    System.out.println(str);
}

我在printArray函数的for each语句中得到了NullPointerException,为什么


共 (6) 个答案

  1. # 1 楼答案

    因为您从未使用任何值初始化数组,所以它只包含一堆null。在调用.toString()之前,需要为它指定值

    例如:

    Integer[] array = new Integer[5] { 1, 2, 3, 4, 5 };
    

    您的初始循环(x = -1)不是更改数组,而是更改循环中的临时对象x。这类似于执行以下操作:

    for (int i = 0; i < array.length; i++) {
        Integer j = array[i];
        j = -1;
    }
    

    相反,如果要使用循环进行初始化,请执行以下操作:

    for (int i = 0; i < array.length; i++) {
        array[i] = -1;
    }
    
  2. # 2 楼答案

    for(Integer x: array){x=-1;}不会初始化数组,它只是将临时变量x设置为-1五次

  3. # 3 楼答案

    赋值是对局部变量x进行的,它不会自动传播到数组变量。 试试这个:

    for(int i = 0; i < array.length; i++) {
         array[i] = -1;
    }
    
  4. # 4 楼答案

    what is going wrong with this java code

    既然你问。。。。我会的

     int[] array=new int[5];
     Arrays.fill(array);
     System.out.println(Arrays.toString(array));
    
    • 整数类型使用int
    • 使用内置数组方法填充和串入数组
    • 对字符串使用StringBuilder而不是+=
    • printString打印字符串或printArray打印数组或返回字符串,因为您可能会忽略结果,就像您在示例中所做的那样。如果它返回字符串,则调用它toString()或assString()
    • 在参数上使用varargs
    • 不要调用对象。toString()作为为您调用的toString()。除了更短之外,null不会引发异常
    • 使用“,”代替“,”
    • 删除最后一个“,”

    但是,如果您想编写自己的printArray

    // the print function is the following
    public static void printArray(Object... objects) {
        StringBuilder str = new StringBuilder();
        for (Object obj : objects)
            str.append(obj).append(", ");
        if (str.length() > 1) str.delete(str.length() - 2, str.length());
        System.out.println(str);
    }
    
    public static void printArray(int... ints) {
        StringBuilder str = new StringBuilder();
        for (int i : array)
            str.append(i).append(", ");
        if (str.length() > 1) str.delete(str.length() - 2, str.length());
        System.out.println(str);
    }
    
  5. # 5 楼答案

    当您执行x=-1时,您将为变量x分配一个新实例,而不改变数组中对象的值。因此,数组实际上是未初始化的

  6. # 6 楼答案

    Integer[] array=new Integer[5];
    for(Integer x: array){x=-1;} 
    

    上面的代码不会更新数组。如果要更新它,需要为数组元素赋值,如下所示

    for( int i = 0; i < array.length; i++ )
      array[ i ] =-1;
    

    第一个代码段没有做任何有用的事情的原因是Java只是按值传递。当您创建一个局部变量x并将一个数组元素作为其值赋给它时(就像您在代码中所做的那样),它将包含对值的引用(整数对象),但不包含对它在数组中的位置的引用。更改x的值时,只需使x指向另一个对象即可