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
相关产品推荐
相关产品推荐

