黑马程序员技术交流社区
标题:
MAP集合实例 出现的编译成功,运行失败 JDK配置的是1.7
[打印本页]
作者:
南瓜静涵
时间:
2012-2-27 21:59
标题:
MAP集合实例 出现的编译成功,运行失败 JDK配置的是1.7
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)
作者:
南瓜静涵
时间:
2012-2-27 22:01
在线等回复啊!!!
那位兄弟帮帮忙!!!
实在是感谢!!
作者:
李晓俊老师
时间:
2012-2-27 22:24
我看了一会终于明白了,问题在这里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;
}
而且这是标准写法,不能改的
作者:
李晓俊老师
时间:
2012-2-27 22:26
"O了吧,必须O!"---毕老师经典语句
作者:
南瓜静涵
时间:
2012-2-27 22:26
谢谢 二楼 这是自己粗心 下回一定记住!!!谢谢你!!!
作者:
南瓜静涵
时间:
2012-2-27 22:27
必须 哦啦!!!{:soso_e102:}{:soso_e102:}{:soso_e102:}
作者:
刘基军
时间:
2012-2-27 22:38
特地在1.6上验证了一下,检查了好一会,居然是LZ把赋值关系搞错了:
Student(String name,int age)
{
name=this.name;
age=this.age;
}
作者:
蒙武辉
时间:
2012-2-27 22:57
哈哈,上次我把hashCode()写成hashcode(),检查了好久没有找到。
作者:
djx900
时间:
2012-2-27 23:11
哦啊 方法 得第2个单词脑袋大写
作者:
南瓜静涵
时间:
2012-2-28 12:46
那是 这个是 编程经验少,得多积累{:soso_e142:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2