带计数字符的NullPointerException

时间:2014-12-03 21:53:18

标签: java nullpointerexception hashmap

我想解决的问题是如何计算短语中的字符数 说:“你的日子怎么样”

到目前为止我得到的是你将短语设置为一个字符串然后你可以循环遍历字符串,使用charAt()功能找到每个索引的每个字符。通过声明一个char变量,我可以在每次循环到哈希映射时在不同的索引处设置不同的char,现在不要责怪我的错误代码,这是我第一次使用哈希映射。但是每次运行程序时都会出现此错误,有人可以帮助我吗?

  

线程“main”java.lang.NullPointerException中的异常       在Main.main(Main.java:30)

    System.out.println("Enter a phrase: ");
    String word = input.nextLine();
    int length = word.length();

    Map<Character, Integer> map = new HashMap<Character, Integer>();



    for(int i = 0; i < word.length(); i++){
        char charAt = word.charAt(i);
        System.out.println(charAt);
        map.put(charAt, map.get(i) + 1);
    }
  }
}

2 个答案:

答案 0 :(得分:1)

问题是,当地图没有密钥map.get(i)时,null会返回i。由于Java的Autoboxing功能,尝试向null添加整数会导致NullPointerException。要解决此问题,请执行以下操作:

if (map.containsKey(i))
  map.put(charAt, map.get(i) + 1);
else
  map.put(charAt, 1);

确保map.get(i)永远不会返回NullPointerException。

答案 1 :(得分:0)

该行

map.put(charAt, map.get(i) + 1);

需要被块替换:

if (map.containsKey(charAt)) {
    map.put(charAt, map.get(charAt) + 1);
} else {
    map.put(charAt, 1);
}

正如另一个答案所指出的,地图不包含i。因此,map.get(i)为空,因此无法取消装箱。需要if-else结构的原因是因为否则,在每个字符的第一次出现时仍会抛出NullPointerException。