私は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;
}
}
あなたは、あなたの質問にエラーが発生しました:NPEは 't.p.hashCode()'で起こります。 'i'はプリミティブであり、[メソッドはプリミティブで呼び出すことはできません](https://stackoverflow.com/a/21748381/4906586)。あなたの 'hashcode'メソッドでは' tphashCode() 'ではなく' p.hashCode() 'を参照することになっています:' t'は別のテストを参照しています(あなたの理由があるかもしれません)その結果、「ヌル」値を有する。これはあなたの 'hashCode()'のようなものです: 'return p.hashCode()+ i;' – Al1
this.p.hashCode()に変更し、Test tとt =(Test)oを削除します。ローカルvarに –
@ Al1 ok、pインスタンス変数は、hashCode()メソッド自体がインスタンスメソッドであるため、TestクラスオブジェクトなしでhashCode()メソッドで呼び出すことができます。 –