java中自定义类数组空指针问题

发布于 2023-04-19  174 次阅读


Java中数组的使用

一、基础内容

  我们使用数组可以大致分成俩种情况,第一种是使用常用数据类型的数组(下方代码块一)。还有一种就是自己写的class数组,也就是对象数组。(下方代码块二)

//代码块一
public class blog {
    static final int LENGTH = 3;

    public static void main(String[] args) {
        int[] num = new int[LENGTH];
        String[] str = new String[LENGTH];

        for(int i = 0; i < LENGTH; i++){
            num[i] = i;
            str[i] = Integer.toString(num[i]);//Integer.toString(num[i])将num[i]转化成字符串
        }

        for(int i = 0; i < LENGTH; i++){
            System.out.println("数字:"+num[i]+"  字符串:"+str[i]);
        }
    }
}

  上方代码输出结果如下:
代码块一运行结果

//代码块二
public class blog {
    static final int LENGTH = 3;

    public static void main(String[] args) {
        Student[] students = new Student[LENGTH];

        for(int i = 0; i < LENGTH; i++){
            students[i] = new Student("");//关键!!!
            students[i].setName("liujyu");
        }

        for(int i = 0; i < LENGTH; i++){
            System.out.println(students[i].getName());
        }
    }
}
class Student{
    private String name;

    Student(String name){
        setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  如果缺少第一个循环中的 students[i] = new Student("");//关键!!!就会出现下方的空指针报错。

  可以理解成,我们自定义的类在new它的数组时,相当创建于一个空壳、下了一个定义,它只是一个声明,有这个东西但是你并不能直接使用它。
  你可能会奇怪为什么上述俩种情况不同呢,其实它们俩种情况是一样的,我们在创建它的数组时都给他分配了空间但是对于第一种情况系统给它的默认值是null,这时候我们无法使用它。我们在代码块二中的重新用构造函数新建它时,其实就让它不在是空,这个时候我们就可以使用它了。

//代码块三
public class blog {
    static final int LENGTH = 3;

    public static void main(String[] args) {
        int[] num = new int[LENGTH];
        String[] str = new String[LENGTH];

        for(int i = 0; i < LENGTH; i++){
            num[i]++;
            str[i] = Integer.toString(num[i]);//Integer.toString(num[i])将num[i]转化成字符串
        }

        for(int i = 0; i < LENGTH; i++){
            System.out.println("数字:"+num[i]+"  字符串:"+str[i]);
        }
    }
}

  代码块三中于代码块一不同的只有第一个for循环中的第一句。它的运行结果如下:

  我们很容易可以推出,在我们创建int数组的时候,系统自动给它赋了初始值0。所以num[i]++;就把原本的0变成了1。

二、拓展内容

  与Java中的基本数据类型一样,类中的成员变量也有一个默认值。对于引用类型的成员变量,默认值为 null,对于基本数据类型的成员变量则如下:

数据类型 系统赋予它的初始值
byte 0
short 0
int 0
long 0
float 0.0
double 0.0
char '\u0000'(空字符)
boolean false

  因此,在编写自己的类时,可以在定义成员变量时指定它们的默认值,例如:

public class MyClass {
    int myInt = 0;
    String myString = null;
    boolean myBoolean = false;

    // 其他类成员和方法...
}

  在上面的示例代码中,myInt 的默认值被设置为0,myString 的默认值被设置为 null,myBoolean 的默认值被设置为 false。我们可以在一些需要非系统分配初始值的初始值时可以使用它。

  最后,当创建 MyClass 类的对象时,如果没有为这些成员变量显式赋值,则它们将拥有其默认值。


学习记录,经验分享