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

كيف احل عقبة الـ java.lang.NullPointerException

بدأه vector_ever في 5 مايو 2011 · 13 رد · 7,561 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لسلام عليكم

في مشاركة سابقة لي كنت قد طرحت سؤال عن الواجهات لربما كان السؤال غامض وغير واضح على كل حال ساطرح سؤال أخير عن الموضوع وباسلوب مختلف

لانني كنت قد طورت الكود بشكل آخر شارفت على النهاية في مشروعي قد اتممت كتابة الكود لكل اجزاء البرنامج

ولكن لدي مشكلة اخيرة وذلك لدى عمل الواجهة كي يتعامل معها المستخدم طبعا انا عملت الواجهة (واجهتين) وكله تمام ولا مشاكل بالموضوع أبدا

عند تشغيل الكود تظهر الواجهة الاولى وفيها ثلاثة ازار كي أعطي المستخدم امكانية الاختيار بادخال البيانات

post-152477-062029900 1304549865_thumb.j

الزر الاول لقراءة الملف من ملف اكسل الثاني لادخالها يدويا والثالث لتوليدها عشوائيا

ثم يقوم الكود ببعض العمليات والحسابات ويظهر واجهة ثانية فيها زرين

post-152477-086497000 1304550093_thumb.j

الزر الاول والثاني يعرضان رسوم بيانية تمثل النتيجة

المشكلة عند الضغط على اي زرين من الزرين الموجودين بالواجهة الاخيرة احصل على خطأ java.lang.NullPointerException

وهو واضح انه في قصور بقراءة المتحولات وتمريرها الى الكلاس المسؤول عن الرسم (حسب تحليلي الشخصي والله اعلم)

حاولت كثيرا ولمدة يومين كاملين لكن دائما احصل على نفس الخطأ دون ادري ا هو السبب حتى استبد بي اليأس فلعلي يا اخوان اجد منكم المساعدة

فقط هذه الخطوة واكون قد انتهيت تماما من المشروعفارجو المساعدة

الكود والمكتبات المطلوبة للتشغيل بالرابط التالي http://www.megaupload.com/?d=Q65LUVBW

الكلاس المسؤول عن تشغيل الواجهة الاولى هو class Main

ام عن الواجهة الثانية class DrawFrame ولسبب ما فانه لا يمرر المدخلات الى class DrawNEHT (الزر الأول) والـ class PieChart (الزر الثاني) المسؤولان عن اظهار الرسومات

طبعا الكود مجرب وكل ه كان يشتغل لكن بعض اضافة الواجهة الاخيرة في الكلاس DrawFrame بدات المشاكل وكانه العطل منه والله اعلم

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

يا ريت المساعدة يا اخوة والله بكون ممنون وبكون من الشاكرين وما حنسى أفضالكوا لانه بكون خلصت كل شي وتخرجت

وشكرا

المرفقات
interface1.jpginterface2.jpg

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#2

مرحبا اخى

عدلت على المشروع حتى نجح فى عرض الرسم البيانى فى الزر الاول

وهذه النتيجة

post-165385-061409100 1304567848_thumb.p

قم باستكمال الرسم البيانى الثانى

وعليك بتنظيف الكود حيث اننى قمت باضافة بعض جمل الطباعة لتتبع الكود اثناء عمله

رابط المشروع http://www.mediafire.com/?yfoa23rl2p9dhrd

بالتوفيق

المرفقات
543.png

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 5 مايو 2011 في 07:16


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#3

أخي لا يوجد شيء بالمرفقات

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#4

شكرا اخي وجزاك الله كل خير

هل من الممكن ان تحيطني علما لماذا كان الخطا يظهر و وما الذي قمت بعمله؟

تم تعديل هذه المشاركة بواسطة vector_ever في 5 مايو 2011 في 07:45

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#5

الخطأ كان بسبب انك دائما تنشئ كائنات جديدة من الفئات Input , ManualInput , SetupTime

عند كل استخدام مع انها تحتوى على بيانات مهمة تقوم الدوال باسترجاعها فى كل مرة

فعند انشاء كائن جديد منها يكون فارغا لا يحتوى على اى بيانات وتأتى انت لتستدعى دوال استرجاع البيانات مثل الدالة getArr() , getSetupTime()

وهذه الدوال تعيد مصفوفات قد تم ملأها فى الدالة read مثلا

عندها كان يجب استخدام كائن واحد فقط لكل فئة من هذه الفئات على مستوى المشروع وهذا ما قمت به حيث جعلت المتغيرات static فى الفئة الرئيسية Main

private static Input read = new Input();
	private static ManualInput a = new ManualInput();
	private static SetupTime st = new SetupTime();

واضفت لها دوال accessors فى نهاية الفئة انظر

public static Input getInput() {
    	return read;
	}

	public static ManualInput getManualInput() {
    	return a;
	}

	public static SetupTime getSetupTime() {
    	return st;
	}

وعند الحاجة اليها اقوم باستدعائها من الفئة Main مباشرة كما يتضح لك فى الفئة DrawFrame

private Input a = Main.getInput();
	private SetupTime b = Main.getSetupTime();
	private MakeSpan c = new MakeSpan(a.getArr(), b.getSetupTime());

بالتوفيق اخى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 5 مايو 2011 في 07:39


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#6

شكرا لسرعة ردك اخي الكريم

لكن التعديل للآسف لم يعطيني النتيجة التي اريدها

عند الضغط على الزر الاول Excel من الواجهة الأولى يحسب العملية اكتر من مرة

المشكلة انه الحسابات صارت خطا يعني بدل ما يحسب الحسابات الموجودة بـكلاس Makespan صار يحسبها مرات عديدة وطبعا هذا الشيء خطا ولا احصل على النتيجة المطلوبة

يا ريت ترد تجرب أخي الكود القديم لترى ما كنت أقصده

الشيء الآخر آخي هل جربت الزرين Random و Manual الموجدين في الواجهة الأولى

طبعا يعطونني نتيجة خاطئة ولا يكملون الحسابات مع انهم كانوا شغالين 100% قبل التعديل

يا ريت أخي الكريم تجرب الزرين وتشوف قبل وبعد التعديل

وبانتظار ردك أخي العزيز

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#7

اذا تتبع الدالة read اظن تكرارها هو الذى سبب المشكلة

ساحاول فى اقرب فرصة ان شاء الله

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#8

أنسب حل أن تستخدم الBreak points

أو تضع try catch

و تستخدم الميثود getMessage

لعلك تفهم ما سبب المشكلة

Senior JEE Developer

IBM WebSphere Speccialist

logo_ibm_certified.gif

#9
MOHAMED FATHEI كتب:

اذا تتبع الدالة read اظن تكرارها هو الذى سبب المشكلة

ساحاول فى اقرب فرصة ان شاء الله

تحياتى

المشكلة تحصل عند اضافة

this.NEHT();

ليصير الكود هكذا

public MakeSpan(int arr[][], int setupTime[][][]) {
        this.arr = arr;
        this.setupTime = setupTime;
   this.NEHT();     // عند هذه الاضافة حدثت التغييرات وتكرار تنفيذ الدالة 4 مرات بدلا من مرة واحدة
    }

    public void NEHT() {
        index = maxCol(arr); // arrange the array coloumns acording to max sum of items for every coloumn
        //  and then return the current index according to orginal array ordering

        arrayreorder(arr, setupTime, index);// arrange the array coloumns to get min makespan
        //  and then return the current index for setup time
        makespan = tabuSearch(arr, setupTime, index);

    }

وهذا يؤدي الى تنفيذ الدالة ()NEHT أربع مرات

بالاضافة الى جعل الزرين الثاني والثالث غير قادرين على اتمام الحساب واعطاء نتيجة error

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#10

اذا فلنجرب الغاء هذا السطر وننظر النتيجة

معذرة اخى على التاخير


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#11
MOHAMED FATHEI كتب:

اذا فلنجرب الغاء هذا السطر وننظر النتيجة

معذرة اخى على التاخير

أكيد جربت الغاء هذا السطر ولكن وقتها احصل على النتيجة السابقة وهي نفس الخطا عند الضغط على على اي من الزرين في الواجهة الثانية

أي اننا لم نستفد شيئا :huh: :huh:

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#12

تفضل اخى الكريم

مشكلتك كانت تكمن فى الكلاس DrawFrame

وخاصه الداله Draw والـ default constructor

انك بداخل الداله draw تقوم بانشاء كائن جديد من الـ DrawFrame مره اخرى

غير التى انشأتها بداخل الـ Main class

وهذا الكائن ﻻ يحتوى على اي بيانات فالـ arr , setuptime , index كل هذه البيانات تساوى null

فبالتالى يعطيك دائما NullPointerException

انا عدلت لك الكود وهو دلوقتى شغال تمام على الثلاث حالات

وعدلت شويه فى مفهوم اغلاق النوافذ

حيث انه عندما تغلق صفحه الرسمه فانه يغلق المشروع ككل ولكن هذا غير صحيح

فانا عدلتها

تفضل هذا هو المشروع

FinalExcel.zip

بالتوفيق جميعا

1

Software Developer
Mahmoudkelany.com


 

#13

والله ما قصرت يا اخ محمود بارك الله فيك والله من اول ما تعلمت الجافا كنت اكبر مساعد لي شكرا جزيلا والله ما بعرف كيف اجازيك

الحل كن رائع وبسيط وأرجو انه ما اكون عذبت معي او انه الحل تعبك او استغرق وقت طويل

مرة تانية وتالتة وعاشرة شكرا

كمان بشكر أخي محمد فتحي والله انه حاول وما قصر كمان

سؤال اخير بسيط كيف اتخلص من جمل الطباعة واعمل تنظيف للكود

وتقبلوا مودتي وتحياتي

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#14
vector_ever كتب:

والله ما قصرت يا اخ محمود بارك الله فيك والله من اول ما تعلمت الجافا كنت اكبر مساعد لي شكرا جزيلا والله ما بعرف كيف اجازيك

الحل كن رائع وبسيط وأرجو انه ما اكون عذبت معي او انه الحل تعبك او استغرق وقت طويل

مرة تانية وتالتة وعاشرة شكرا

كمان بشكر أخي محمد فتحي والله انه حاول وما قصر كمان

سؤال اخير بسيط كيف اتخلص من جمل الطباعة واعمل تنظيف للكود

وتقبلوا مودتي وتحياتي

الحمدلله على كل شىء

اى نعم اخد وقت شويه لكن مفيش مشكله

بالنسبه للتخلص من جمل الطباعه

فليس هناك جمل طباعه كثيره

ولكن هناك صناديق حواريه تظهر للمستخدم ماذا انت تفعل

المعقول انك تظهر له البيانات الـ input data , وتظهر له Setuptime

انما موضوع الترتيب وهكذا اظن انه عبء على المستخدم

لذلك انا عملت باقى الجمل التى تظهر الترتيب وخلافه كومنت يمكنك استعادتها كيفها تشاء

وفيه جزئيه انا عدلت فيها وهى جزئيه اخذ البيانات من المستخدم فى حاله الـ Manual , Random

ﻻحظت انك تستخدم الـ LOOPA , LOOPB , ... لكن هذه الحيله نلجأ اليها كأخر حل اذا لم نجد لها بديلا

انا عدلتها بحيث انها تتأكد من الـinput الذى يدخل وتحوله لرقم

وجعلتها ايضا اذا ضغط المستخدم على cancel فانه يلغى العمليه كلها

واذا اراد العمليه مره اخرى فعليه البدأ من جديد

يمكنك ملاحظه الفرق فى الكود وفى التشغيل

FinalExcel.zip

بالتوفيق

1

Software Developer
Mahmoudkelany.com


 

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