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

クラスの メソッドhashCodeequalsメソッドを実装します。それ以外の場合は、常に が返されます。Citymap.get(new City("London", "Paris"));null

于 2012-11-07T16:04:25.187 に答える
1

結果を使用しようとすると、おそらく nullpointer を取得しています。これを機能させるには、city の equals メソッドと hashcode メソッドも実装する必要があります。

于 2012-11-07T16:04:22.620 に答える
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;
    }

equalsの実装は簡単なはずです。

2つの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が発生する理由にはいくつかの理由があります。

  • マップがnullです。だからあなたがmap.get()それをするときそれはあなたに例外を投げます
  • equals()andhashCode()メソッドをオーバーライドしていないため、をオーバーライドするとget()、マップは正しいオブジェクトを返さず、代わりにnullを返します。これを操作しようとすると、例外が発生します。
于 2012-11-07T16:07:30.620 に答える