Java开发:如何为Friend类实现ID自增并为新增好友分配ID标识
问题根源
你的代码存在三个核心问题导致ID不递增+运行报错:
- 没有全局的ID自增计数器:现有
Id是Freunde类的成员变量,每个新的好友对象初始化时Id默认都是0,没有全局变量记录当前已分配的ID序号,自然不会递增 - 代码结构逻辑错误:你把存储所有好友的
Kontakt列表直接写在了Freunde(单个好友)类里,属于设计错误,正确逻辑应该是好友组类(friendsgroup)存储ArrayList<Freunde>列表,每个Freunde对象对应单个好友的所有属性(ID、姓名、邮箱等) - 修改后的
addfriend方法里Kontakt.get(id)逻辑错误:你还没把ID对应元素加入列表就去读取对应下标的内容,自然会报索引越界异常
修复方案
第一步:修改Freunde(单个好友)类
新增静态全局ID计数器,移除所有列表相关逻辑,仅保留单个好友的属性和方法:
public class Freunde { // 静态全局计数器,所有Freunde对象共享,记录下一个要分配的ID private static int nextId = 1; private int id; private String lastName; private String firstName; private String email; private String adresse; // 构造方法,创建对象时自动分配ID public Freunde(String firstName, String lastName, String email, String adresse) { this.id = nextId++; // 分配ID后计数器自动+1 this.firstName = firstName; this.lastName = lastName; this.email = email; this.adresse = adresse; } // 直接输出单条好友的完整信息,包含自增ID @Override public String toString() { return id + "," + lastName + "," + firstName + "," + email + "," + adresse; } // 仅保留单个好友属性的get/set方法 public int getId() { return id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAdresse() { return adresse; } public void setAdresse(String adresse) { this.adresse = adresse; } }
第二步:修改friendsgroup(好友组)类
所有好友的增删改查、存储逻辑都放到这个类实现:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Friendsgroup { // 存储所有好友对象的列表 private List<Freunde> kontaktList = new ArrayList<>(); // 添加好友方法,不需要手动传ID,会自动生成 public void addFriend(String firstName, String lastName, String email, String adresse) { Freunde newFriend = new Freunde(firstName, lastName, email, adresse); kontaktList.add(newFriend); } // 按姓名搜索好友 public Freunde searchByName(String name) { for (Freunde friend : kontaktList) { if (friend.getFirstName().equals(name) || friend.getLastName().equals(name)) { System.out.println("找到好友:" + friend); return friend; } } System.out.println("未找到对应好友"); return null; } // 按ID删除好友 public boolean removeFriendById(int id) { Iterator<Freunde> iterator = kontaktList.iterator(); while (iterator.hasNext()) { Freunde friend = iterator.next(); if (friend.getId() == id) { iterator.remove(); return true; } } return false; } // 获取所有好友列表 public List<Freunde> getKontaktList() { return kontaktList; } }
第三步:修改添加好友的调用逻辑
if (selection == 2) { // Add friend System.out.println("Kontaktdata"); System.out.println("---------------------"); System.out.printf("Firstname: "); input = new Scanner(System.in); String vorname = input.next(); System.out.printf("LastName: "); String name = input.next(); System.out.printf("Email: "); String email = input.next(); System.out.printf("Adresse: "); String adresse = input.next(); // 直接调用好友组的添加方法即可,ID自动生成 bornList.addFriend(vorname, name, email, adresse); System.out.println("好友添加成功"); System.out.println("back to menu"); System.in.read(); Start.menü(); selection = input.nextInt(); }
补充说明
- 静态变量
nextId是所有Freunde对象共享的,只要JVM不重启,每次创建新的好友对象都会自动累加,实现ID自增 - 拆分单个好友属性和好友列表存储逻辑后,避免了原来单例存属性导致的覆盖问题,增删改查逻辑也更清晰
- 你之前ID始终为0的问题,本质是因为没有给
Id赋值的逻辑,每个新对象的Id都是int类型的默认初始值0,修改后创建对象时会自动从1开始分配ID
内容的提问来源于stack exchange,提问作者user9630935
相关产品推荐
相关产品推荐

