我有以下地图:
Map<City, Integer> map = getMap();
和我的班级城市:
public class City {
private String c1;
private String c2;
public City(String c1, String c2){
this.c1 = c1;
this.c2 = c2;
}
现在我有一个充满价值的地图,我需要寻找一个特定的密钥,例如:“伦敦,巴黎”。我的主要方法是这一个:
map.get(new City("London", "Paris"));
出于某种原因,它正在给我
线程“main”中的异常java.lang.NullPointerException
我几乎可以肯定我不能这样做。
答案 0 :(得分:2)
为hashCode
课程实施equals
和City
方法,否则map.get(new City("London", "Paris"));
将始终返回null
。
答案 1 :(得分:1)
当您尝试使用结果时,您可能正在获取nullpointer。为此,您还需要实现city的equals和hashcode方法。
答案 2 :(得分:0)
如果您要在哈希映射中使用您的类,则需要覆盖hashCode
和equals
:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((c1 == null) ? 0 : c1.hashCode());
result = prime * result + ((c2 == null) ? 0 : c2.hashCode());
return result;
}
平等的实施应该是微不足道的。
您的代码失败,因为您没有为编译器定义如何比较两个City对象。您可以通过覆盖equals
函数来定义比较规则。每当您覆盖equals函数时,您还应该覆盖hashCode
函数。哈希映射使用hashCode
函数以有意义和最佳的方式存储键 - 值对。在哈希映射中执行查找时也会使用hashCode
函数。
您可以在以下文章中找到有关这些语义的更多丰富且更准确的信息:http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html
答案 3 :(得分:0)
有几个原因可能会导致您遇到NullPointerException:
map.get()
时,它会抛出异常equals()
和hashCode()
方法,因此当您执行get()
时,地图不会返回正确的对象,而是返回null。当你尝试使用它时,你会得到例外。