2017-11-08 12 views
-1

私は2つの質問に、次がありますか?のhashCode()とNullPointerExceptionが

2)どのようなシナリオでも、hashCode()というメソッドが呼び出され、呼び出されませんでしたか? (ハッシュ関連クラスのオブジェクトを使用している場合にのみコールを受け取りますか?)

o/pはnullです。

 
Exception in thread "main" java.lang.NullPointerException 
        at Test.hashCode(EqualsHashcode.java:65) 
        at java.util.Hashtable.put(Unknown Source) 
        at EqualsHashcode.main(EqualsHashcode.java:20) 
import java.util.*; 
public class EqualsHashcode 
{ 

    public static void main(String[] args) 
    { 
     //System.out.println("Main Method"); 
     Test s = new Test("bharat",1); 
     Test p = new Test("bharat",1); 
     //System.out.println(s); 
     //System.out.println(p); 
     //System.out.println(s.equals(p)); 
     Test q = new Test("bharat",2); 
     //System.out.println(q); 
     //System.out.println(s.equals(q)); 
     Test r = new Test("bhara",1); 
     //System.out.println(r); 
     //System.out.println(s.equals(r)); 
     Hashtable ht = new Hashtable(); 
     ht.put(s,"1"); 
     ht.put(p,"1"); 
    } 

} 

class Test 
{ Test t; 
    String p; 
    int i; 
    Test(String s, int j) 
    { 
     p=s; 
     i=j; 
    } 

    public String toString() 
    { 
     System.out.println(p+".."+i); 
     return p+" Hashcode is"+p.hashCode(); 
    } 

    public boolean equals(Object o) 
    { 
     if (this==o) 
     { 
      return true; 
     } 
else if (o instanceof Test) 
     {    
     t = (Test) o; 
      if (this.p.equals(t.p) && this.i==t.i) 
          return true; 
      else 
       return false; 
     } 
else 

     return false; 

    } 

    public int hashCode() 
    { 

     System.out.println(t); 
     System.out.println("Calling hashCode" + " "+ t.p.hashCode()+t.i); 
     return t.p.hashCode()+t.i; 
    } 
} 
+0

あなたは、あなたの質問にエラーが発生しました:NPEは 't.p.hashCode()'で起こります。 'i'はプリミティブであり、[メソッドはプリミティブで呼び出すことはできません](https://stackoverflow.com/a/21748381/4906586)。あなたの 'hashcode'メソッドでは' tphashCode() 'ではなく' p.hashCode() 'を参照することになっています:' t'は別のテストを参照しています(あなたの理由があるかもしれません)その結果、「ヌル」値を有する。これはあなたの 'hashCode()'のようなものです: 'return p.hashCode()+ i;' – Al1

+0

this.p.hashCode()に変更し、Test tとt =(Test)oを削除します。ローカルvarに –

+0

@ Al1 ok、pインスタンス変数は、hashCode()メソッド自体がインスタンスメソッドであるため、TestクラスオブジェクトなしでhashCode()メソッドで呼び出すことができます。 –

答えて

0

私はそれはあなたが望んでこのことだと思う:

public class EqualsHashcode { 

    public static void main(String[] args) { 
     Test s = new Test("bharat", 1); 
     Test p = new Test("bharat", 1); 
     Test q = new Test("bharat", 2); 
     Test r = new Test("bhara", 1); 
     Hashtable ht = new Hashtable(); 
     ht.put(s, "1"); 
     ht.put(p, "1"); 
    } 

} 

class Test { 
    String p; 
    int i; 

    Test(String s, int j) { 
     p = s; 
     i = j; 
    } 

    public String toString() { 
     System.out.println(p + ".." + i); 
     return p + " Hashcode is" + p.hashCode(); 
    } 

    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } else if (o instanceof Test) { 
      Test t = (Test) o; 
      if (this.p.equals(t.p) && this.i == t.i) { 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 

    public int hashCode() { 
     System.out.println(this); 
     System.out.println("Calling hashCode" + " " + this.p.hashCode() + this.i); 
     return this.p.hashCode() + this.i; 
    } 
} 
+0

ok、pインスタンス変数は、hashCode()メソッド自体がインスタンスメソッドであるため、TestクラスオブジェクトなしでhashCode()メソッドで呼び出すことができます。そう? –

+0

あなたは正しいです - 彼らはすべて同じインスタンスにあります - あなたは "これを書くことができます。 –

+0

私はCastクラスをTestクラスにのみ入力したい、oがinstanceofの場合のみClassCastExceptionを回避するためにそうでない場合はテストします。だから、インスタンスフィールドとしてテストを宣言している間、上記の要件を満たすことができる方法はありますか?私は1つ考えることができない –