Java调用getter获取列表对象属性报错问题求解
报错根因
三个编译错误以及隐藏问题的产生原因如下:
- 非静态方法非法调用:
getMonth()、getDay()是Date类的实例成员方法,没有加static修饰,这类方法必须依附具体的Date类实例才能调用。你直接通过类名Date调用这两个方法,相当于尝试在静态上下文调用实例方法,不符合Java语法规则。同时你的代码完全没有遍历传入的List<Human>参数,也没有从每个Human对象中取出其持有的birthday(即Date类实例),核心业务逻辑存在缺失。 - 局部变量未初始化:你声明了
Human类型的局部变量human,但从未给该变量赋值(没有绑定任何具体的Human实例)。Java语法要求局部变量必须显式初始化后才能被使用,直接将未初始化的human传入Map的put方法就会触发该错误。 - 隐藏的语法/逻辑错误:一是定义的Map变量名为
personSign,后续调用put方法时错写为humanSign,会触发“找不到符号”的编译错误;二是Human类中getBirthday方法的返回值错写为不存在的BirthDate类型,和实际属性类型Date不匹配;三是if/else分支未添加花括号,会导致put操作不受分支条件控制,出现逻辑穿透问题;四是方法声明了Map<Human, String>返回值,但原代码没有写return语句,也会触发编译错误。
修复方法
按以下步骤修改即可解决所有问题:
- 修正基础类的语法错误:补全
Date类缺失的右花括号,将Human类中getBirthday方法的返回值类型从BirthDate改为Date,和成员属性类型保持一致。 - 遍历传入的
humanlist参数,逐个取出列表中的Human实例赋值给局部变量human,解决变量未初始化的问题。 - 对每个取出的
Human实例,先调用getBirthday()获取其对应的Date类型生日对象,再通过该对象调用getMonth()、getDay()获取月、日数值,禁止直接通过类名调用实例方法。 - 统一Map变量名,给所有
if/else分支添加花括号,确保星座赋值、Map写入逻辑在正确的分支内执行,最后补全方法的return语句返回结果。
修正后的可运行核心代码参考:
import java.util.*; // 修正后的Date类 public class Date { private int month; private int day; public Date(int month, int day) { this.month = month; this.day = day; } public int getMonth() { return month;} public int getDay() {return day;} } // 修正后的Human类 public class Human { private String name; private Date birthday; public Human(String name, Date birthday) { this.name = name; this.birthday = birthday; } public String getName() { return name;} public Date getBirthday() { return birthday;} // 修正返回值类型 } public class Zodiac { public static Map<Human, String> zodiacToHuman(List<Human> humanlist){ Map<Human, String> personSign = new HashMap<>(); // 遍历所有传入的Human对象 for (Human human : humanlist) { String sign; // 从当前Human对象中取生日实例,再获取月、日 Date birthday = human.getBirthday(); int month = birthday.getMonth(); int day = birthday.getDay(); // 1月星座判断示例,其余月份按相同规则补充即可 if (month == 1) { if (day < 20) { sign = "capricornus"; } else { sign = "aquarius"; } personSign.put(human, sign); } // 其余月份判断逻辑... } return personSign; } }
内容的提问来源于stack exchange,提问作者nollanblodat
相关产品推荐
相关产品推荐

