Chat类中HashMap的put方法抛出NullPointerException空指针异常如何解决
问题根因
- 你代码中的
Chat类构造方法定义错误,导致成员变量HashMap<Integer, String> messages未完成初始化,调用put方法时触发空指针异常。 - Java语法规定类的构造方法不能声明返回值类型,你给
Chat()方法添加了void修饰符后,该方法就从构造方法变成了普通成员方法。执行new Chat()时只会调用编译器自动生成的无参空构造,你写的初始化逻辑不会被触发,messages始终为null。
解决方案
移除Chat()方法前的void修饰符即可,以下是修正后的完整代码:
import java.util.HashMap; import java.util.Scanner; class Chat { HashMap<Integer, String> messages; // 去掉void修饰符,恢复为类的构造方法 Chat() { this.messages = new HashMap<>(); } public void add(int id, String newMessage) { if (!newMessage.isEmpty()) { // 优化:id本身就是int类型,不需要重复转String再转int System.out.println(newMessage + " " + id); this.messages.put(id, newMessage); // 原输出中的hashset是笔误,messages实际是HashMap System.out.println(messages.values() + "Added to hashmap"); } } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Chat obj = new Chat(); int size = Integer.parseInt(sc.nextLine()); for (int i = 0; i < size; i++) { String str = sc.nextLine(); if (!str.isEmpty()) { obj.add(i + 1, str); } } sc.close(); } }
其他优化建议
- 你代码中
Integer.parseInt(String.valueOf(id))属于冗余操作,id本身就是int类型,可直接使用。 - 输出日志中提到的
hashset是笔误,messages的类型是HashMap。 - Scanner使用完毕后建议调用
close()方法释放资源。
内容的提问来源于stack exchange,提问作者Tyndale verwer
相关产品推荐
相关产品推荐

