2014-12-03 41 views
-1

问题就在这里,我试图解决的是如何在一个短语 数个字符说:“你今天怎么样”用的NullPointerException字符计数

什么我目前得到的是,你将设置短语作为一个字符串,你可以遍历字符串来找到每个索引中的每个单独的字符,使用charAt()函数。通过声明一个char变量,我可以在每次通过散列映射到一个不同的索引时设置一个不同的char,现在不要责怪我错误的代码,这是我第一次使用散列映射。但每次运行程序时都会出现此错误,请问有人可以帮我解决这个问题吗?

在Main.main(Main.java:30)在线程 “主” 显示java.lang.NullPointerException 异常

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); 
    } 
    } 
} 
+0

Main.java:30 --->代码中的第30行是什么?您在第30行的引用为空,在空引用上操作会产生NullPointerException。 – kosa 2014-12-03 21:54:24

+0

我的每个人都很糟糕| map.put(charAt,map.get(i)+ 1); =第30行 – 2014-12-03 21:55:13

+0

如果您有答案,请关闭该问题。 – kosa 2014-12-03 21:56:25

回答

1

的问题是,map.get(i)返回null当地图没有按”没有钥匙i。尝试向null添加整数会导致由于Java的自动装箱功能导致的NullPointerException。为了解决这个问题,这样做:

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

它确保map.get(i)永远不会返回一个NullPointerException。由块被替换

+0

怎么样我在循环中声明的int不应该表明我的“索引号” – 2014-12-03 21:56:55

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仍将在每个字符的第一次出现时抛出。

+0

ahhh我现在看到非常感谢你 – 2014-12-03 21:57:24