Java 短语中字母的出现

Java 短语中字母的出现,java,string,Java,String,我得到以下错误: 线程“main”java.lang.NullPointerException中的异常位于 CountLetters.tallyPrint(CountLetters.java:12)位于 main(CountLetters.java:21) 目标是将出现的每个字母存储在HashMap中。键是字母,值是出现次数的# package HashMap; import java.util.HashMap; public class CountLetters { public

我得到以下错误:

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

目标是将出现的每个字母存储在
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"));
    }
}
包HashMap;
导入java.util.HashMap;
公营书信{
公共HashMap tallyPrint(字符串短语){
整数计数=0;
HashMap fav=新的HashMap();
对于(inti=0;iIn

子表达式

fav.get(phrase)
应该是

fav.get(phrase.substring(i,i+1))
您试图增加一个计数,但不是获取要添加1的前一个值,而是获取一个不相关键的值,因此您得到了一个
NullPointerException
尝试将
null
自动取消装箱到
int
替换
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:您应该提取该
子字符串
,并将其存储在一个临时变量中,以提高效率,从而避免对同一子字符串反复调用
子字符串


旁注2:谢谢你在你的问题中发布了全部内容(包括主要方法)。如果所有提问者都这样做,会使问题变得更简单。

你需要在这里使用
charAt()
,而不是子字符串,因为这会在你试图读取地址时提供
NPE

完整代码
import java.util.HashMap;
公营书信{
公共HashMap tallyPrint(字符串短语){
整数计数=0;
HashMap fav=新的HashMap();

对于(int i=0;我可以发布更多关于您得到的异常的详细信息吗?特别是,在发生异常的行上添加注释,并在HashMap.CountLetters.main(CountLetters.java:21)的线程“main”java.lang.NullPointerException中发布完整的堆栈跟踪异常'请改为编辑您的问题。不要在评论中发布堆栈跟踪。否,因为如果字母是hashmap中的键,我需要增加计数already@Prasanth,请查看我的扩展注释。@Prasanth
fav.get(短语)
未获取当前字母的计数。
phrase
此时为
“我的脚发臭,我的鼻子在跑”
,而不是
“m”
“y”
,所以它返回一个
null
值。当Java试图执行
null+1
fav.get(短语)+1
)时,它抛出异常。@MikeSamuel:你能补充一下为什么
HashMap
String.charAt(i)
会是一个更好的答案,我会自己回答,但回答问题的原始部分几乎和你的一样。@durron597,我认为这是一个更好的解决方案,因为将字符与字符串区别对待会导致类型检查器捕捉到此错误。它可能也会稍微更有效,并且更容易适应计算代码点。如果这是您的实际输出,那么您的代码是错误的(事实就是如此)。@cHao He did
”“+char
,所以没有,他自己把它装箱了。很抱歉,在这里花了一些时间更新了正确的代码。现在已经更新了。@mtk:这很好,但是使用
哈希映射
比执行所有
字符串
构造更好。只有当它是一个
fav.get(phrase.substring(i,i+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"));
    }
}