0

我有以下地图:

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"));

出于某种原因,它给了我

线程“主”java.lang.NullPointerException 中的异常

而且我几乎可以肯定我不能这样做。

4

4 回答 4

2

实现类的hashCodeandequals方法City,否则map.get(new City("London", "Paris"));总是返回null

于 2012-11-07T16:04:25.187 回答
1

当您尝试使用结果时,您可能会得到空指针。为此,您还需要实现 city 的 equals 和 hashcode 方法。

于 2012-11-07T16:04:22.620 回答
0

如果要在哈希映射中使用类,则需要覆盖hashCodeand 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;
    }

equals 的实现应该是微不足道的。

您的代码失败,因为您没有为编译器定义如何比较两个 City 对象。您可以通过覆盖该equals函数来定义比较规则。每当您覆盖 equals 函数时,您也应该覆盖该hashCode函数。哈希映射使用该hashCode函数以有意义和最佳的方式存储键值对。hashCode在哈希映射中执行查找时也使用该函数。

您可以在以下文章中找到有关这些语义的更丰富、更准确的信息:http: //www.ibm.com/developerworks/java/library/j-jtp05273/index.html

于 2012-11-07T16:07:28.333 回答
0

关于您可能会遇到 NullPointerException 的原因有几个:

  • 您的地图为空。因此,当您执行 a 时map.get(),它会抛出异常
  • 由于您没有覆盖equals()andhashCode()方法,因此当您执行 a 时get(),地图不会返回正确的对象,而是返回 null。当您尝试使用此功能时,您会遇到异常。
于 2012-11-07T16:07:30.620 回答