遇到的一个很有趣的陷阱

今天在做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

遇到的一个很有趣的陷阱的相关文章

一个很有趣的算法

var arr = [ 3000,0,1000,'aa', 2000, 4000, 8000, 6000, 7000, 5000]; for (i = 0; i < arr.length; i++) { setTimeout(function(num) { console.log(num); debugger; }, arr[i], arr[i]); } 先看结果 哈哈是不是很有趣. 竟然自动排序了. 其实把原理很简单 首先setTimeout有两种形式 setTimeout(code,inte

在网上看到一个很有趣的小游戏

<html> <title>猜数字</title> <body> <center><h2>猜数字</h2></center> <hr> <script> var target=36; var number=0; do{ number=window.prompt("输入数字",number); if(number==null || number==target) bre

微软推出一个非常有趣的网站—— How-old.net 看照片猜年龄!

周末休闲一下啊!! 微软推出一个非常有趣的网站-- How-old.net 看照片猜年龄!这是由微软机器学习团队的工程师们开发的一个"年龄测试"的新玩意,通过图像脸部识别和大数据分析,可以快速识别出照片中的人的性别和年龄!而且还能一次判断多人,网上大家玩得很欢乐,也来试试看你的颜值被认为是几岁吧-- 网址: http://how-old.net/#results

编程,很有趣,也很催泪(一)

我几乎都忘记自己是怎么开始就迷上了编写程序这项本来完全和自己无关的活动的了,我只是一个会计,普普通通的那种. 那时候,在通过了注册会计师考试的会计科目以后,我在一家不错的企业找到一份会计的工作.一次偶然的机会,公司的excel里的vba出了问题,IT部门没有人手处理,大家都在忙着开发我们的核心业务应用,对于我们财务部这些excel里的小宏程序,完全没有计划去维护,况且编写这些vba代码的大哥早已离职,IT部那些科班出身的大牛都懒得看这些凌乱的vba代码,他们懂得JAVA,懂得Oracle,懂得L

一个简单有趣的SQL存储过程——个人财务管理

刚开始学习存储过程的小白,网上看完语法后一般都会想实践一下,但往往又不知道该写个什么样的存储过程来练手,以下就提供一个简单有趣.用来查询每月个人财务状况的存储过程. 一.建表 首先需要建一张事实表,用来记录每月重要的支出,包括支出的类型.费用.付款方式.每月付款时间.首次分期还贷时间.最后分期还贷时间(还完的时间).用途.支出大类...不一定会都用到,也可以根据实际情况做相应的增减,以下仅提供一个例子. CREATE TABLE [dbo].[Fact_CostType] ( [CostType

一个很实用的前端框架Zui

杰哥给我推荐了一个很有用的前端框架-Zui,我看着觉得很神奇的,因为有很多我都不懂.在这里分享总结一下.首先,这是一个中国自己开发的框架,比起很多外国的框架来说,有很详细的API,而且是全中文的,不需要再经过其他人的翻译了.然后,它的内容十分丰富,很系统的分为了:基础,控件,组件,JS插件,视图几大块:而且使用起来,只需要导入js,在适当的地方加上正确的class类就可以了.对于,没有什么js基础的人,也是十分容易上手的.下面我就大体的介绍一下它的各个模块的功能.基础:基础里面我觉得很有用的主要

第一次作业:假装这里有一个很响亮的标题

---恢复内容开始--- 一.结缘计算机 缘分可以说是一个很奇妙的东西,喜欢一件事物往往从对它的美好幻想开始.相信许多人想到计算机都会将它与玩游戏联系在一起,对于我却不然,在我看来编程是一个创造的过程--这就是我对于计算机最初的美好幻想.试想通过编写一些代码便能够实现自己心中所想,这难道不是一件令人兴奋的事吗?它执行你的指令,完成你的任务,实现你的想法,这在当时是对我非常有吸引力的,于是我第一志愿便填报了计算机专业. 你认为你的条件如何?其实我并不知道这个问题应该如何回答,物质条件?素质方面?条

Go map中一个很重要的特性

先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = "c" for k, v := range m { fmt.Println(k, v) } fmt.Println("-----------------") mm := make(map[int]string) mm[1] = "a" mm[2] = &q

一个很奇怪的问题

先来看看我的一段代码: 1 ArrayList<Integer> array = new ArrayList<Integer>(); 2 3 for(int i = 0;i<100;i++){ 4 array.add(i); 5 } 6 for(int i=0;i<array.size();i++){ 7 // array.remove(new Integer(i)); 8 array.remove(i); 9 } 你觉得这样能不能把array里面的东西都删除呢? 输出