今天在做ACM题的时候,遇到了一个问题,记下来,避免下次再遇到。
问题
问题很简单大概就是输入一段话,然后打印出里面包含了a-z的字母分别有多少个。贴出代码
package com.csdhsm.acm4; import java.util.HashMap; import java.util.Map; import java.util.Scanner; class NumberOfLetters{ private Map<Character, Integer> values; public NumberOfLetters() { values = new HashMap<Character, Integer>(); } /** * @Description add the letter to HashMap * @author Han * @param c * @return */ public int addLetter(char c){ return values.get(c) == null ? values.put(c, 1) : values.put(c, values.get(c) + 1); } /** * @Description get the count of letter from map * @author Han * @param c * @return */ public int getLetter(char c){ return values.get(c) == null ? 0 : values.get(c); } } /** * @Title: Main.java * @Package: com.csdhsm.acm4 * @Description Ignatius is doing his homework now. * The teacher gives him some articles and asks him to tell * how many times each letter appears. * @author Han * @date 2016-4-19 下午3:11:23 * @version V1.0 */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNextLine()){ NumberOfLetters letters = new NumberOfLetters(); char[] input = scanner.nextLine().toCharArray(); //add to map for(int i = 0; i < input.length; i++){ if(input[i] >= ‘a‘ && input[i] <= ‘z‘) letters.addLetter(input[i]); } //print a-z and its` number for(char c = ‘a‘; c <= ‘z‘; c++){ System.out.println(c + ":" + letters.getLetter(c)); } System.out.println(); } } }
然后就开始疯狂的报我空指针异常,很奇怪,看了半天看不出来,不知道你能看的出来吗,没办法,只有拿出了我的调试大法,打上断点,跟着进源码,很快就发现了问题,在addLetter()方法的地方,使用HashMap的put()方法的时候,返回了null,而我的方法return的是一个int的基本类型,我去,赶紧打开API查看。
put方法返回的是一个旧值,也就是在我即将要覆盖的那个值,若没有,则返回null,而在java中的装箱与拆箱中,如果包装类型是null,在拆箱的过程中就会报出NullPointerException。到这里问题也解决了,把返回类型从int改为包装类Integer,顺利得到AC,最后感觉装箱,拆箱的概念又有点模糊了,赶紧search复习复习。
Java自动装箱与拆箱及其陷阱 这篇文章总结得很好大家可以看看。
时间: 2024-10-26 03:44:42