Java中addInterest方法添加Interest对象到链表时构造方法报错求助
问题核心报错原因
Interest类的构造方法定义错误:Java中构造方法不能有返回值类型声明,你给构造方法加了void,导致它变成了普通成员方法,而非类的构造方法,且你定义的这个方法要求传入String和int两个参数,调用时没有传参自然会报参数不匹配的错误。- 构造方法逻辑矛盾:你定义构造方法时预留了
topic和level两个参数,但方法内部没有使用传入的参数,反而直接通过Scanner读取用户输入,逻辑冗余。 addInterest方法逻辑错误:方法接收了Interest类型的参数后直接用new Interest()覆盖了传入的对象,后续又尝试把普通方法当构造方法调用,逻辑完全混乱。- 不要在构造方法里随意关闭
Scanner:如果你关闭了包装System.in的Scanner,后续整个程序都无法再读取控制台输入,因为System.in会被连带关闭。
修复方案
第一步:修复Interest类
你可以选择两种实现方式,按需选择即可:
方式1:构造方法内直接读取用户输入(不需要传参)
public class Interest extends Member implements Serializable { private String topic; private int level; // 去掉void,无参构造方法,内部处理用户输入 public Interest() { Scanner in = new Scanner(System.in); System.out.print("Topic: "); this.topic = in.nextLine(); System.out.println("Level (1 - 10): "); this.level = in.nextInt(); // 不要关闭in,避免System.in被连带关闭 } // 可选:添加getter方法方便后续读取属性 public String getTopic() { return topic; } public int getLevel() { return level; } }
方式2:构造方法通过传参赋值,输入逻辑放到外层(解耦更合理)
public class Interest extends Member implements Serializable { private String topic; private int level; // 去掉void,构造方法接收参数赋值 public Interest(String topic, int level) { this.topic = topic; this.level = level; } // getter方法同上 }
第二步:修复addInterest方法
对应上面的两种Interest实现,选对应的修改即可:
对应方式1的addInterest实现
public void addInterest() { // 直接创建Interest实例,构造方法会自动触发用户输入 Interest interest = new Interest(); topics.add(interest); }
调用时直接调用无参的addInterest()即可,不需要传参数。
对应方式2的addInterest实现
public void addInterest() { Scanner in = new Scanner(System.in); System.out.print("Topic: "); String topic = in.nextLine(); System.out.println("Level (1 - 10): "); int level = in.nextInt(); // 传入读取到的参数创建Interest实例 Interest interest = new Interest(topic, level); topics.add(interest); }
这种方式把输入逻辑和实体类拆分,后续复用Interest类时更灵活,更推荐。
内容的提问来源于stack exchange,提问作者Felipe Chavoya
相关产品推荐
相关产品推荐

