为什么我的哈希码得到一个空指针?
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 == null
、face == 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;
不太正确。首先,您要比较 suit
和 face
(显然是错字)。我也猜你希望小丑是平等的?目前他们不会,因为如果 suit == null
方法 returns false
。这些行应该是简单的
if (face == s.face && suit == s.suit)
return true;
您不需要对枚举常量使用 .equals
。使用 ==
的好处在于,因为您没有使用方法,所以您无需担心空值。
我正在尝试创建自己的哈希码,但我收到了空指针错误。是因为我的对象 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 == null
、face == 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;
不太正确。首先,您要比较 suit
和 face
(显然是错字)。我也猜你希望小丑是平等的?目前他们不会,因为如果 suit == null
方法 returns false
。这些行应该是简单的
if (face == s.face && suit == s.suit)
return true;
您不需要对枚举常量使用 .equals
。使用 ==
的好处在于,因为您没有使用方法,所以您无需担心空值。