如何正确初始化对象数组以避免 NullPointerException
发布时间 - 2025-12-31 00:00:00 点击率:次在 java 中声明对象数组(如 `student[] s = new student[3];`)仅创建了引用容器,数组元素默认为 `null`;必须显式调用 `new student()` 为每个索引位置实例化对象,否则调用 `s[i].setname(...)` 将抛出 nullpointerexception。
Java 中的对象数组本质上是对象引用的数组,而非对象本身的数组。当你执行:
Student[] s = new Student[3];
JVM 仅分配一个长度为 3 的引用容器,其中每个元素初始值均为 null —— 此时并未创建任何 Student 实例。若跳过实例化直接访问 s[0].setName("Alice"),就会触发 NullPointerException,错误信息明确指出:Cannot invoke "Student.setName(String)" because "s[i]" is null。
✅ 正确做法:在使用前逐个 new 出对象
应在循环中为每个索引显式创建实例,例如:
Scanner scanner = new Scanner(System.in);
Student[] students = new Student[3];
for (int i = 0; i < students.length; i++) {
students[i] = new Student(); // ✅ 关键:必须先实例化!
System.out.print("Enter Name: ");
students[i].setName(scanner.nextLine());
System.out.print("Enter ID: ");
students[i].setId(scanner.nextLine());
System.out.print("Enter Phone Number: ");
students[i].setPhoneNumber(scanner.nextInt());
scanner.nextLine(); // 消费换行符,避免 nextLine() 被跳过
}⚠️ 注意事项:
- 不要重复创建多个 Scanner:原代码中 new Scanner(System.in) 被多次调用(name、ID、phoneNumber),不仅资源冗余,还可能导致输入流异常。应共用一个 Scanner 实例。
- 数组越界风险:原代码声明 new Student[2] 却尝试访问 s[2](索引 2),超出合法范围 [0,1],将引发 ArrayIndexOutOfBoundsException。务必确保数组长度 ≥ 元素数量,并用 students.length 控制循环边界。
-
nextInt() 后的换行符陷阱:nextInt() 不读取后续换行符,导致下一次 nextLine() 直接返回空字符串。建议在 nextInt(
) 后紧跟 scanner.nextLine() 清理缓冲区。
? 完整可运行示例(修复版):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
final int N = 3;
Student[] students = new Student[N]; // 声明引用数组
Scanner sc = new Scanner(System.in);
for (int i = 0; i < N; i++) {
students[i] = new Student(); // ✅ 必须!为每个元素分配对象
System.out.print("Enter Name: ");
students[i].setName(sc.nextLine());
System.out.print("Enter ID: ");
students[i].setId(sc.nextLine());
System.out.print("Enter Phone Number: ");
students[i].setPhoneNumber(sc.nextInt());
sc.nextLine(); // 清理缓冲区
}
// 输出验证
for (int i = 0; i < N; i++) {
System.out.printf("Student %d: %s (ID: %s, Phone: %d)%n",
i + 1,
students[i].getName(),
students[i].getId(),
students[i].getPhoneNumber()
);
}
sc.close();
}
}? 总结:对象数组 ≠ 对象数组(含实例)。牢记口诀:“声明不等于创建,引用需手动 new”。每次访问 arr[i].method() 前,请确认 arr[i] != null —— 最稳妥的方式就是在赋值前执行 arr[i] = new Type()。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何升级到最新版本?(升级指南和步骤)
黑客如何通过漏洞一步步攻陷网站服务器?
如何快速搭建高效WAP手机网站?
Python文件异常处理策略_健壮性说明【指导】
lovemo网页版地址 lovemo官网手机登录
打造顶配客厅影院,这份100寸电视推荐名单请查收
制作公司内部网站有哪些,内网如何建网站?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
EditPlus中的正则表达式 实战(1)
西安专业网站制作公司有哪些,陕西省建行官方网站?
Android仿QQ列表左滑删除操作
Laravel Docker环境搭建教程_Laravel Sail使用指南
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站制作免费,什么网站能看正片电影?
如何用PHP快速搭建高效网站?分步指南
,怎么在广州志愿者网站注册?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
高防服务器租用首荐平台,企业级优惠套餐快速部署
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
如何在云虚拟主机上快速搭建个人网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
网站制作壁纸教程视频,电脑壁纸网站?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
黑客如何利用漏洞与弱口令入侵网站服务器?
如何实现建站之星域名转发设置?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
JS经典正则表达式笔试题汇总
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel如何生成URL和重定向?(路由助手函数)
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
如何用花生壳三步快速搭建专属网站?


) 后紧跟 scanner.nextLine() 清理缓冲区。