You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java数组初始化test类时出现NullPointerException问题求助

Java数组初始化引发NullPointerException的解决办法

问题根源

你碰到的Exception in thread "main" java.lang.NullPointerException: Cannot invoke "trying.test.setName(String)" because "t[i]" is null异常,核心原因是:
创建数组test[] t = new test[3];时,仅为数组分配了可容纳3个test对象的内存空间,但数组内的每个元素t[i]初始值都是null——没有实际创建test类的实例对象,直接调用setName等方法必然触发空指针异常。

修复方案

方案1:添加无参构造,先实例化再赋值

首先给test类添加无参构造方法(原类只有带参构造,无法直接new test()):

public class test {
    private String name ;
    private String studenid;
    private int phonenumber;

    // 添加无参构造
    public test() {}

    public test(String name, String studenid, int phonenumber) {
        this.name = name;
        this.studenid = studenid;
        this.phonenumber = phonenumber;
    }

    // 原有getter/setter保持不变
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getStudenid() { return studenid; }
    public void setStudenid(String studenid) { this.studenid = studenid; }
    public int getPhonenumber() { return phonenumber; }
    public void setPhonenumber(int phonenumber) { this.phonenumber = phonenumber; }
}

然后修改Main类,在循环中先创建test实例再调用setter方法:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        test[] t = new test[3];
        for (int i = 0; i < t.length; i++) {
            // 关键步骤:先实例化test对象,赋值给数组元素
            t[i] = new test();
            
            System.out.println("\nEnter name " + (i+1) + " : ");
            t[i].setName(sc.next());
            System.out.println("Enter studentID : ");
            t[i].setStudenid(sc.next());
            System.out.println("Enter phone number : ");
            t[i].setPhonenumber(sc.nextInt());
        }

        for (int i = 0; i < t.length; i++) {
            System.out.println("Name " + (i+1) + " : " + t[i].getName());
            System.out.println("Student ID  : " + t[i].getStudenid());
            // 修正原代码错误:此处应调用getPhonenumber()而非getStudenid()
            System.out.println("Phone number : " + t[i].getPhonenumber());
        }
        sc.close(); // 关闭输入流
    }
}

方案2:直接用带参构造初始化对象(无需添加无参构造)

这种方式更简洁,直接用用户输入的值创建test实例并赋值给数组元素:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        test[] t = new test[3];
        for (int i = 0; i < t.length; i++) {
            // 先获取用户输入的所有参数
            System.out.println("\nEnter name " + (i+1) + " : ");
            String name = sc.next();
            System.out.println("Enter studentID : ");
            String studentId = sc.next();
            System.out.println("Enter phone number : ");
            int phoneNum = sc.nextInt();
            
            // 直接用带参构造创建实例并赋值给数组元素
            t[i] = new test(name, studentId, phoneNum);
        }

        for (int i = 0; i < t.length; i++) {
            System.out.println("Name " + (i+1) + " : " + t[i].getName());
            System.out.println("Student ID  : " + t[i].getStudenid());
            System.out.println("Phone number : " + t[i].getPhonenumber());
        }
        sc.close();
    }
}

额外提示

原代码中输出电话号码时错误调用了getStudenid(),已在修复方案中修正为getPhonenumber(),避免输出错误数据。

内容的提问来源于stack exchange,提问作者kiki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:35:30