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

从Map元素创建对象时遭遇NullPointerException的解决方法

解决你的NullPointerException问题

看起来你这段代码的NPE主要来自两个常见的坑,还有一个小拼写错误,我给你逐个拆解并修复:

问题1:nextInt()留下的换行符坑

当你用input.nextInt()读取用户输入的活动数量后,输入流里还残留着一个换行符。接下来的input.nextLine()会直接读取这个空的换行符,导致code变成空字符串。这时候activities.get("")肯定返回null,调用clone()自然就触发NullPointerException了。

问题2:输入的活动代码不存在

就算解决了换行问题,如果用户输入的代码在activities里找不到,activities.get(code)还是会返回null,调用clone()同样会炸NPE。

额外小问题:拼写错误

代码里的companyAcitivities多打了一个i,应该是companyActivities,这个编译时就会报错,先修正。


修复后的完整代码

public static JavaFact register(JavaFact jf) {
    Scanner input = new Scanner(System.in);
    // 补全getAllActivities的调用括号,原代码漏了
    Map<String, Activity> activities = jf.getAllActivities();
    Map<String, Activity> companyActivities = new HashMap<String, Activity>();

    System.out.println("How many activities is the user involved in?");
    // 读取数字后,用nextLine吃掉残留的换行符
    int count = input.nextInt();
    input.nextLine();

    for (int i = 0; i < count; i++) {
        System.out.println("Insert activity code");
        // 加trim()处理用户输入的前后空格,避免因为空格找不到活动
        String code = input.nextLine().trim();
        Activity a = activities.get(code);
        
        // 关键:空值检查,避免NPE
        if (a == null) {
            System.out.println("Oops! Activity code '" + code + "' doesn't exist. Skipping this one.");
            continue;
        }
        
        companyActivities.put(code, a.clone());
    }
    // 原方法声明返回JavaFact,补全返回语句
    return jf;
}

额外优化说明

  1. 给getAllActivities()补全了括号——原代码漏了,这会导致编译错误。
  2. 给input.nextLine()加了trim(),可以处理用户输入时不小心加的前后空格,避免因为空格导致找不到对应活动。
  3. 增加了友好的错误提示,用户输入无效代码时会收到反馈,而不是直接崩溃。
  4. 补全了方法的返回语句,因为原方法声明返回JavaFact,不返回的话编译也会报错。

内容的提问来源于stack exchange,提问作者John Mulaney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:42