You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语句,也会触发编译错误。
修复方法

按以下步骤修改即可解决所有问题:

  1. 修正基础类的语法错误:补全Date类缺失的右花括号,将Human类中getBirthday方法的返回值类型从BirthDate改为Date,和成员属性类型保持一致。
  2. 遍历传入的humanlist参数,逐个取出列表中的Human实例赋值给局部变量human,解决变量未初始化的问题。
  3. 对每个取出的Human实例,先调用getBirthday()获取其对应的Date类型生日对象,再通过该对象调用getMonth()、getDay()获取月、日数值,禁止直接通过类名调用实例方法。
  4. 统一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:21:15