从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; }
额外优化说明
- 给
getAllActivities()补全了括号——原代码漏了,这会导致编译错误。 - 给
input.nextLine()加了trim(),可以处理用户输入时不小心加的前后空格,避免因为空格导致找不到对应活动。 - 增加了友好的错误提示,用户输入无效代码时会收到反馈,而不是直接崩溃。
- 补全了方法的返回语句,因为原方法声明返回
JavaFact,不返回的话编译也会报错。
内容的提问来源于stack exchange,提问作者John Mulaney
相关产品推荐
相关产品推荐

