You need to enable JavaScript to run this app. Java开发:如何为Friend类实现ID自增并为新增好友分配ID标识
优惠活动
大模型
产品
解决方案
定价
更多

Java开发:如何为Friend类实现ID自增并为新增好友分配ID标识

问题根源

你的代码存在三个核心问题导致ID不递增+运行报错:

  1. 没有全局的ID自增计数器:现有Id是Freunde类的成员变量,每个新的好友对象初始化时Id默认都是0,没有全局变量记录当前已分配的ID序号,自然不会递增
  2. 代码结构逻辑错误:你把存储所有好友的Kontakt列表直接写在了Freunde(单个好友)类里,属于设计错误,正确逻辑应该是好友组类(friendsgroup)存储ArrayList<Freunde>列表,每个Freunde对象对应单个好友的所有属性(ID、姓名、邮箱等)
  3. 修改后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:45:03