1

我收到以下错误:

HashMap.CountLetters.tallyPrint(CountLetters.java:12) 在 HashMap.CountLetters.main(CountLetters.java:21) 的线程“主”java.lang.NullPointerException 中的异常

目标是将每个字母的出现存储在HashMap. 键是字母,值是出现次数。

package HashMap;

import java.util.HashMap;

public class CountLetters {
    public HashMap tallyPrint(String phrase) {
        int count = 0;
        HashMap<String, Integer> fav = new HashMap<String, Integer>();
        for (int i = 0; i<phrase.length(); i++)
        {
            if (fav.containsKey(phrase.substring(i,i+1)))
                fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1);
            else
                fav.put("" + phrase.substring(i,i+1),1);
        }
        return fav;
    }

    public static void main(String[] args) {
        CountLetters x = new CountLetters();
        System.out.println(x.tallyPrint("my feet smell and my nose runs"));
    }
}
4

3 回答 3

2

fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1)

子表达式

fav.get(phrase)

应该

fav.get(phrase.substring(i,i+1))

您正在尝试增加计数,但不是获取要加 1 的先前值,而是获取不相关键的值,因此您NullPointerException尝试自动取消装箱nullint.

于 2012-12-05T20:51:38.770 回答
1

您需要在charAt()此处使用而不是子字符串,因为这会在NPE您尝试读取地址 1 更多字符时给出。

完整代码

import java.util.HashMap;

public class CountLetters {
    public HashMap tallyPrint(String phrase) {
        int count = 0;
        HashMap<Character, Integer> fav = new HashMap<Character, Integer>();
        for (int i = 0; i<phrase.length(); i++) {
            if (fav.containsKey(phrase.charAt(i))) 
                fav.put(phrase.charAt(i), (fav.get(phrase.charAt(i)))+1);
            else
                fav.put(phrase.charAt(i),1);
        }
        return fav;
    }

    public static void main(String[] args) {
        CountLetters x = new CountLetters();
        System.out.println(x.tallyPrint("my feet smell and my nose runs"));
    }
}

输出

{f=1, =6, d=1, e=4, a=1, n=3, o=1, l=2, m=3, u=1, t=1, s=3, r= 1, y=2}

于 2012-12-05T20:54:45.973 回答
0

代替 fav.put("" + phrase.substring(i,i+1), fav.get(phrase)+1);

和:

fav.put("" + phrase.substring(i,i+1), fav.get(phrase.substring(i,i+1))+1);

旁注1:您应该将其提取substring并将其存储在临时变量中以提高效率,这样您就不会substring一遍又一遍地调用相同的子字符串。

旁注2:感谢您在您的问题中发布整个(使用主要方法)。如果所有提问者都这样做,它会变得更简单。

于 2012-12-05T20:53:20.043 回答