جرب :
import java.util.*;
class A{
public static void main(String[] args){
Map map =new HashMap();
map.put(map,"Aha");
System.out.println(map.get(map));
}
}وش سبب الـException :unsure:
جرب :
import java.util.*;
class A{
public static void main(String[] args){
Map map =new HashMap();
map.put(map,"Aha");
System.out.println(map.get(map));
}
}وش سبب الـException :unsure:
أظن ان الصحيح هكذا
import java.util.*;
class A{
public static void main(String[] args){
Map map =new HashMap();
map.put(map,"Aha");
System.out.println(map.get("Aha"));
}
}نونونو ،
اللوجيك صحيح ، الداله get تأخذ مفتاح وترجع قيمته ، وهنا أخذت المفتاح بس طلع أكسبشن !
المفروض يرجع Aha
خطأ مبدئ ( ع الطاير يعني ) :
map.put(map,"Aha");
put بتاخد string ثم object موش العكس key,value pairs و المعروف أن ال key بيكون string و ال value من النوع Object
:D أنا بصيت ف ال doc لقيت ال أنا كتبه غلط :D
put ( Object key, Object value )
ممكن أستخدم ال compiler :D ؟؟ !
أنا ستخدمت ال compiler وعرفت هو زعل ليه ، بس معرفتش ال exception ده حصل إزاي ?
الأخ الفاضل ...
جرب أستخدام
import java.util.*;
class A
{
public static void main(String[] args)
{
Map map = new HashMap();
map.put("1", "Aha");
System.out.println(map.get("1"));
}
}شكراً
Nothing is impossible, the word impossible itself says that: I M - Possible
daziplqa كتب:السؤال مباشر و الرد :
انتا بتغش ولا ايه ؟
فعلا في Exception ناتج عن وجود استدعء ذاتي
من المعروف ان الكلاس يحتوي على كود وداتا
عندما ستدتعي الميثود put تعمل access على الداتا وهي الماب والتي تحتوي على نفس الكود مما يسبب استدعاء لا نهائي
يمكن اسلوبي مش واضح !!
منقطع من حين لاخر
فعلاً مو واضح ،
لو توضح المسأله بالمنطق ،
ماذا يحصل لماذا هذا الاكسبشن بالتحديد ، ماهي المثد التي جعلت هذا الاكسبشن يظهر
اسئلتك دائما محيره يا عيسى..
اعتقد ان المشكله في عدم القدره على تغيير رقم hashCode لكل من
1- الكائن map
2 - key : map
الميثود التي يصدر منها الاكسبشن هي
public int hashCode() {
return (key==NULL_KEY ? 0 : key.hashCode()) ^
(value==null ? 0 : value.hashCode());
}الموجوده في الكلاس الداخلي Entry
نوع الاكسبشن : java.lang.StackOverflowError
:unsure:
تم تعديل هذه المشاركة بواسطة ali7876 في 28 مايو 2007 في 09:13
اقتباسالسؤال مباشر و الرد :
أقصد سؤال الأخ Eng. Usama ( كنت عاوز أوريكم اللينوكس ;) )
طبعا سؤال الأخ عيسي مو مباشر ؛
اقتباسعتقد ان المشكله في عدم القدره على تغيير رقم hashCode لكل من1- الكائن map
2 - key : map
هو ده، بس ممكن تفهمنا الحل ؟
اقتباسعندما ستدتعي الميثود put تعمل access على الداتا وهي الماب والتي تحتوي على نفس الكود مما يسبب استدعاء لا نهائي
ال exception في get ، أما put فشغاله عادي
اقتباسNote: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map. A special case of this prohibition is that it is not permissible for a map to contain itself as a key. While it is permissible for a map to contain itself as a value, extreme caution is advised: the equals and hashCode methods are no longer well defined on a such a map.
كلام من صن في الـ Documentation
منقطع من حين لاخر
جميل ،
السبب هو أن الhashCode للkey هو نفسه الhashCode للMap
عندما تستدعي الداله get فإنه يستدعي الداله hashCode للمفتاح المرسل سيحاول أخذ هذه الـEntry باستدعاء الـhashCode للـEntry
وبالتالي فإننا نقع في infinite loop لأن كل واحد ينادي الثاني إلى أن يمتلئ Stack من هذه المناداه ويطلع الerror
اللغز جبته وانا أقرأ في السورس كود حق HashMap ،
public int hashCode() {
int h = 0;
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext())
h += i.next().hashCode();
return h;
}وهذا الخاص بالكلاس Entry
public final int hashCode() {
return (key==null ? 0 : key.hashCode()) ^
(value==null ? 0 : value.hashCode());
}لاحظ المناداه في السطر الخامس من المثد الأولى والسطر الثاني من المثد الثانيه ،
كل واحد يستدعي الثاني . . .
المُهم نريد أسئله ولو كانت بسيطه فقط لنتشارك ،
متأسف، انا كنت اعتقد انك بتسأل عن الخطأ فى التنفيذ :)
Nothing is impossible, the word impossible itself says that: I M - Possible
لا عليك أخي اسامه ، بالعكس أفرحتني مشاركتك ،
مبرمج في بي وجافا ، ماشاء الله عليك
هذا الموضوع مغلق.