新增联系人时触发java.lang.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

