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

Why am I getting a null pointer for my 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;
}

我刚刚意识到您似乎将小丑表示为 suit == nullface == Joker。如果牌是小丑,每当你做 suit.anything 时,你都会得到 NullPointerException

该行可能是:

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

或者,您也可以向 Suit 枚举添加一个 Joker 常量,这样您就不必担心 null.

编辑

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

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

不太正确。首先,您要比较 suitface(显然是错字)。我也猜你希望小丑是平等的?目前他们不会,因为如果 suit == null 方法 returns false。这些行应该是简单的

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

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