الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لغز صغيير بالجافا . . .

مغلق
بدأه زائر في 27 مايو 2007 · 17 رد · 1,209 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

جرب :

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:

#2

أظن ان الصحيح هكذا

	


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"));

	}
}
#3

نونونو ،

اللوجيك صحيح ، الداله get تأخذ مفتاح وترجع قيمته ، وهنا أخذت المفتاح بس طلع أكسبشن !

المفروض يرجع Aha

#4

خطأ مبدئ ( ع الطاير يعني ) :

map.put(map,"Aha");

put بتاخد string ثم object موش العكس key,value pairs و المعروف أن ال key بيكون string و ال value من النوع Object

#5

:D أنا بصيت ف ال doc لقيت ال أنا كتبه غلط :D

put ( Object key, Object value )

ممكن أستخدم ال compiler :D ؟؟ !

#6

أنا ستخدمت ال compiler وعرفت هو زعل ليه ، بس معرفتش ال exception ده حصل إزاي ?

#7

الأخ الفاضل ...

جرب أستخدام

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"));
	}
}

شكراً

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#8

السؤال مباشر و الرد :

post-70497-1180293156_thumb.png

#9
daziplqa كتب:
السؤال مباشر و الرد :

انتا بتغش ولا ايه ؟

فعلا في Exception ناتج عن وجود استدعء ذاتي

من المعروف ان الكلاس يحتوي على كود وداتا

عندما ستدتعي الميثود put تعمل access على الداتا وهي الماب والتي تحتوي على نفس الكود مما يسبب استدعاء لا نهائي

يمكن اسلوبي مش واضح !!

منقطع من حين لاخر

#10

فعلاً مو واضح ،

لو توضح المسأله بالمنطق ،

ماذا يحصل لماذا هذا الاكسبشن بالتحديد ، ماهي المثد التي جعلت هذا الاكسبشن يظهر

#11

اسئلتك دائما محيره يا عيسى..

اعتقد ان المشكله في عدم القدره على تغيير رقم 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

#12
اقتباس
السؤال مباشر و الرد :

أقصد سؤال الأخ Eng. Usama ( كنت عاوز أوريكم اللينوكس ;) )

طبعا سؤال الأخ عيسي مو مباشر ؛

اقتباس
عتقد ان المشكله في عدم القدره على تغيير رقم hashCode لكل من

1- الكائن map

2 - key : map

هو ده، بس ممكن تفهمنا الحل ؟

#13
اقتباس
عندما ستدتعي الميثود put تعمل access على الداتا وهي الماب والتي تحتوي على نفس الكود مما يسبب استدعاء لا نهائي

ال exception في get ، أما put فشغاله عادي

#14
اقتباس

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

منقطع من حين لاخر

#15

جميل ،

السبب هو أن ال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());
		}
#16

لاحظ المناداه في السطر الخامس من المثد الأولى والسطر الثاني من المثد الثانيه ،

كل واحد يستدعي الثاني . . .

المُهم نريد أسئله ولو كانت بسيطه فقط لنتشارك ،

#17

متأسف، انا كنت اعتقد انك بتسأل عن الخطأ فى التنفيذ :)

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#18

لا عليك أخي اسامه ، بالعكس أفرحتني مشاركتك ،

مبرمج في بي وجافا ، ماشاء الله عليك

هذا الموضوع مغلق.

مواضيع مشابهة