A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.*;

class MapTest
{
        public static void main(String[] args)
        {
                HashMap<Student,String> hm= new HashMap<Student,String>();
               
                hm.put(new Student("lisi-1",21),"beijing");
                hm.put(new Student("lisi-2",22),"hunan");
                hm.put(new Student("lisi-3",23),"hainan");
                hm.put(new Student("lisi-4",22),"guangdong");

                for (Iterator<Student> it=hm.keySet().iterator();it.hasNext() ; )
                {
                        System.out.println(hm.get(it.next()));
                }

        }
}

class Student implements Comparable<Student>
{
        private String name;
        private int age;

        Student(String name,int age)
        {
                name=this.name;
                age=this.age;
        }

        public int getAge()
        {
                return age;
        }

        public String getName()
        {
                return name;
        }

        public int hashCode()//  若不复写 则不会报错!
        {
                return name.hashCode()+age*39;
        }

        public boolean equals (Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");

                Student s=(Student) obj;

                return this.name.equals(s.name)&& this.age==s.age;
        }

        public int compareTo(Student s)
        {
                int num=new Integer(this.getAge()).compareTo(new Integer(s.getAge()));

                if (num==0)
                        return this.getName().compareTo(s.getName());

                return num;
        }

}

此程序编译会通过,但是运行失败!求各位大虾帮忙啊。若不复写hashCode方法 则不会报错,求解释啊! 我与毕老师的代码相同,但是我配置的JDK是1.7的。
会不会是JDK的问题,求解释!!!谢谢!!
Exception in thread "main" java.lang.NullPointerException
        at maptest.Student.hashCode(MapTest.java:51)
        at java.util.HashMap.put(HashMap.java:389)
        at maptest.MapTest.main(MapTest.java:16)

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

9 个回复

倒序浏览
在线等回复啊!!!
    那位兄弟帮帮忙!!!
       实在是感谢!!
回复 使用道具 举报
我看了一会终于明白了,问题在这里Student(String name,int age)
        {
                name=this.name;
                age=this.age;
        }
这种写法是大忌,你这等于把this.name赋给了传进来的参数name,拿第一个来说
传进来的是lisi-1,而本来this.name的初始化为null,这时候第一个Person对象的名字为null了,年龄也是一样的道理,
当Person的名字和年龄都是空的时候,你传入集合时,集合自动调用hashCode方法去返回哈希值,但是发现name和age都是空
所以这是时发生空指针异常NullPointerException,,你把构造函数这样写就ok了:
Student(String name,int age)
        {
                this.name=name;
            this.age=age;
        }
而且这是标准写法,不能改的
回复 使用道具 举报
"O了吧,必须O!"---毕老师经典语句

评分

参与人数 1技术分 +1 收起 理由
admin + 1 OL

查看全部评分

回复 使用道具 举报
谢谢 二楼 这是自己粗心  下回一定记住!!!谢谢你!!!
回复 使用道具 举报
必须 哦啦!!!{:soso_e102:}{:soso_e102:}{:soso_e102:}
回复 使用道具 举报
刘基军 黑马帝 2012-2-27 22:38:35
7#
特地在1.6上验证了一下,检查了好一会,居然是LZ把赋值关系搞错了:
Student(String name,int age)
        {
                name=this.name;
                age=this.age;
        }
回复 使用道具 举报
蒙武辉 黑马帝 2012-2-27 22:57:00
8#
哈哈,上次我把hashCode()写成hashcode(),检查了好久没有找到。
回复 使用道具 举报
djx900 黑马帝 2012-2-27 23:11:31
9#
哦啊  方法 得第2个单词脑袋大写
回复 使用道具 举报
那是  这个是 编程经验少,得多积累{:soso_e142:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马