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

新增联系人时触发java.lang.NullPointerException异常求助

解决新增联系人后保存抛出NullPointerException的问题

嘿,我看了你的代码,问题出在addnew()方法里的数组扩容和数据复制逻辑上,这直接导致保存时写入了null值,触发了java.lang.NullPointerException。咱们一步步来拆解和修复:

核心错误分析

  • 循环条件完全错误,原有联系人数据没被复制
    你写的循环:

    for (int i = 0; i == studentinfo.length; i++) {
        temp[0][i] = studentinfo[0][i];
        // ... 其他字段复制
    }
    

    这里的条件i == studentinfo.length一开始就不成立(i初始是0,studentinfo.length是4,因为它是4行的二维数组),所以循环体根本没执行。新的temp数组里除了你后面手动赋值的新增联系人,其他位置全是null,保存时writer.write(null)就会抛出异常。

  • 数组扩容的维度理解错了
    studentinfo是[4][n]的结构:4行对应姓名、电话、地址、邮箱,n列对应n个联系人。但你创建新数组时用了new String[4][studentinfo.length + 1],studentinfo.length是行数(4),这意味着你把联系人数量扩容到了5,而不是在原有联系人数量基础上加1。正确的应该用studentinfo[0].length来获取原有联系人数量。

  • 新增联系人的索引位置错误
    你赋值新增联系人时用了studentinfo[0][studentinfo.length],这里studentinfo.length还是4,这会把新联系人放到第5列(索引从0开始),但如果原有联系人数量是3,那第0-2列都是null,保存时必然写入null。

修复后的addnew()方法

把addnew()替换成下面的代码,我已经修正了所有问题:

public static void addnew() throws IOException {
    System.out.println("enter new name:");
    String newname = scanner.next();
    scanner.nextLine(); // 吃掉换行符,避免后续输入问题
    System.out.println("enter new number:");
    String newnum = scanner.next();
    scanner.nextLine();
    System.out.println("enter new address:");
    String newaddr = scanner.next();
    scanner.nextLine();
    System.out.println("enter new email:");
    String newemail = scanner.next();
    scanner.nextLine();

    // 获取原有联系人数量
    int originalCount = studentinfo[0].length;
    // 创建新数组:4行,原有数量+1列
    String temp[][] = new String[4][originalCount + 1];

    // 复制原有联系人数据到新数组
    for (int i = 0; i < originalCount; i++) {
        temp[0][i] = studentinfo[0][i];
        temp[1][i] = studentinfo[1][i];
        temp[2][i] = studentinfo[2][i];
        temp[3][i] = studentinfo[3][i];
    }

    // 添加新联系人到最后一列
    temp[0][originalCount] = newname;
    temp[1][originalCount] = newnum;
    temp[2][originalCount] = newaddr;
    temp[3][originalCount] = newemail;

    // 替换原数组
    studentinfo = temp;

    System.out.println("new contact added!");
    save();
}

额外的小建议

  • 在select()方法里,如果用户输入的名字不存在,selected变量会保持默认值0,可能导致修改错误的联系人。建议在循环后加个判断,如果没找到匹配项,提示用户重新输入。
  • scan()方法里初始化resizer时,new String[4][linecount / 4],假设每4行对应一个联系人,这个逻辑没问题,但如果文件行数不是4的倍数,会导致数组长度不对,建议加个判断处理这种情况。
  • save()方法里先调用了scanner.close(),这会导致后续如果还有输入操作会报错,建议把scanner.close()移到main方法的最后,或者只在程序结束时关闭。

这样修改后,新增联系人后保存就不会再抛出NullPointerException了,原有联系人数据也能正确保留和写入文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:27:42