为什么我的哈希码得到一个空指针?

时间:2015-10-10 22:37:25

标签: java hashmap hashcode

我正在尝试创建自己的哈希码,但是我得到了一个空指针错误。是因为我的对象,Suit和Face,没有自己的哈希码?我一直在线查找哈希码的例子,因为这是我第一次使用它们,我尝试从我在网上看到的例子中加入。

import java.util.HashMap;

enum Suit {Diamonds, Hearts, Spades, Clubs};
enum Face {
            King, Queen, Jack, Ten, Nine, Eight, Seven,
            Six, Five, Four, Three, Two, Ace, Joker
        };

public class SuitAndFace {

    Suit suit;
    Face face;

    SuitAndFace(Suit s, Face f){
        suit = s;
        face = f;
    }

    public String toString(){
        if(!face.toString().equals("Joker"))
            return face + " of " + suit;
        else//joker has no suit
            return face.toString();
    }

@Override
    public boolean equals(Object o){

    System.out.println(" in equals");
    if(o instanceof SuitAndFace){
        SuitAndFace s = (SuitAndFace) o; 
        if(this.face.equals(s.face) && this.suit.equals(s.face))
            return true;    
    }
    return false;
}

@Override
public int hashCode() {
    int hash = 3;
    hash = 7 * hash + this.suit.hashCode();
    hash = 7 * hash + this.face.hashCode();
    return hash;
}

}

更新的方法:

@Override
    public boolean equals(Object o){

    System.out.println(" in equals");
    if(o instanceof SuitAndFace){
        SuitAndFace s = (SuitAndFace) o; 
        if(face != null && suit != null && this.face.equals(s.face) && this.suit.equals(s.face))
            return true;    
    }
    System.out.println("no match!");
    return false;
}

@Override
public int hashCode() {
    int hash = 3;
    if(suit != null && face != null){
        hash = 7 * hash + this.suit.hashCode();
        hash = 7 * hash + this.face.hashCode();
    }
    return hash;
}

1 个答案:

答案 0 :(得分:2)

我刚刚意识到你似乎以suit == nullface == Joker代表笑话。如果卡片是小丑,只要你NullPointerException,你就会获得suit.anything

该行可能是:

hash = 7 * hash + this.suit == null ? 0 : this.suit.hashCode();

或者,您也可以在Joker枚举中添加Suit常量,然后您就不必担心null

修改

使用您编辑的代码,我可以看到行

if(face != null && suit != null && this.face.equals(s.face) && this.suit.equals(s.face))
        return true;

不太对劲。首先,您要比较suitface(显然是一个错字)。我也猜你想让笑话平等吗?目前它们不会是因为如果suit == null方法返回false。这些行应该只是

if (face == s.face && suit == s.suit)
    return true;

您不需要将.equals用于枚举常量。使用==的好处是,因为您没有使用方法,所以您不必担心空值。