如何正确初始化对象数组以避免 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()。


# java  # ai 


相关栏目: 【 网站优化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应用指南  如何用花生壳三步快速搭建专属网站?