Java 短语中字母的出现
我得到以下错误: 线程“main”java.lang.NullPointerException中的异常位于 CountLetters.tallyPrint(CountLetters.java:12)位于 main(CountLetters.java:21) 目标是将出现的每个字母存储在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
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,请查看我的扩展注释。@Prasanthfav.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"));
}
}