PDA

View Full Version : سوال: این ارور برای چیه ؟object refrence not set to an instance of an object



yekta99
چهارشنبه 28 تیر 1391, 17:46 عصر
سلام دوستان
این برنامه توی اجرا مشکل داره ، کارش اینه که کاربر یه گزینه از منو انتخاب میکنه مثلا : اضافه کردن دانشجو و انتخاب بعدی case 4 برای جستجو بر اساس شماره دانشجویی ، تا اینحا رو درست کار می کنه ولی بعد از اون اگر گزینه دیگه رو انتخاب کنیم اضافه کردن درس یا استاد ، بعد بخواهیم case های مربوط به اونا رو بررسی کنیم باز هم جواب رو نشون میده ولی با این ارور روبرو میشم

object refrence not set to an instance of an object

البته فرقی توی ترتیب انتخاب گزینه ها نیست ، در هر مورد برای کار با case دوم این مشکل رو دارم .
type cast ها رو فکر نمی کنم مشکلی داشته باشن ، مقدار تهی هم ندارم

خط هایی که این ارور رو نشون میده :

case 4 :
Console.WriteLine("Student : {0},{1},{2}", s.StName, s.StFamily, s.StID);

case 5 :
if (teach.TFamily.Contains(word))

case 6 :
if (NumUnit < cs.NumOfUnit)

ببخشید اگه بد توضیح دادم و کدم خیلی طولانیه

static void Main(string[] args)
{

ArrayList arylst = new ArrayList();
Hashtable ht = new Hashtable();
while (true)
{
int menu = ShowMenu();
switch (menu)
{
case 1://Add Student
Console.Write("Number of student? ");
int stNum = int.Parse(Console.ReadLine());
for (int i = 0; i < stNum; i++)
{
Student st = new Student();
Console.Write("Student Name : ");
st.StName = Console.ReadLine();
arylst.Add(st.StName);
Console.Write("Student Family : ");
st.StFamily = Console.ReadLine();
arylst.Add(st.StFamily);
Console.Write("Student ID : ");
st.StID = int.Parse(Console.ReadLine());
arylst.Add(st.StID);
ht[st.StID] = st;
}
break;

case 2://Add Teacher
Console.Write("Number of Teacher? ");
int TNum = int.Parse(Console.ReadLine());
for (int i = 0; i < TNum; i++)
{
Teacher tch = new Teacher();
Console.Write("Teacher Name : ");
tch.TName = Console.ReadLine();
arylst.Add(tch.TName);
Console.Write("Teacher Family : ");
tch.TFamily = Console.ReadLine();
arylst.Add(tch.TFamily);
Console.Write("Teacher ID : ");
tch.Tid = int.Parse(Console.ReadLine());
arylst.Add(tch.Tid);
ht[tch.Tid] = tch;

}
break;

case 3://Add Course
Console.Write("Number of Course? ");
int CNum = int.Parse(Console.ReadLine());
for (int i = 0; i < CNum; i++)
{
Course crs = new Course();
Console.Write("Course Name : ");
crs.CName = Console.ReadLine();
arylst.Add(crs.CName);
Console.Write("Number of Unit : ");
crs.NumOfUnit = int.Parse(Console.ReadLine());
arylst.Add(crs.NumOfUnit);
ht[crs.NumOfUnit] = crs;
}
break;

case 4://Search Student
Console.Write("Student ID for search : ");
int idforSearch = int.Parse(Console.ReadLine());
if (arylst.Contains(idforSearch))
if (ht.ContainsKey(idforSearch) == true)
{
Student s = ht[idforSearch] as Student;
Console.WriteLine("Student : {0},{1},{2}", s.StName, s.StFamily, s.StID);
}
break;

case 5://Search Teacher
Console.Write("Word for search : ");
string word = Console.ReadLine();
foreach (DictionaryEntry item in ht)
{
Teacher teach = item.Value as Teacher;
if (teach.TFamily.Contains(word))
{
Console.WriteLine("Teacher's family ={0}", teach.TFamily);
}
}
break;

case 6:
Console.Write("Number to compare with Units of Course : ");
int NumUnit = int.Parse(Console.ReadLine());
foreach (DictionaryEntry item in ht)
{
Course cs = item.Value as Course;
if (NumUnit < cs.NumOfUnit)
Console.WriteLine("Course ={0}", cs.CName);
}
break;

}
}

}
}
}

tooraj_azizi_1035
چهارشنبه 28 تیر 1391, 17:53 عصر
سلام
دقیقاً از کدوم خط خطا می گیره؟

yekta99
چهارشنبه 28 تیر 1391, 17:59 عصر
توی case های 4و5و6 ، خط هایی رو که بالا گذاشتم .
یعنی نه که همزمان به این سه خط گیر بده ، هرکدم از این case ها رو که برای بار دوم صدا می زنم error میده

ممنون از توجهتون

tooraj_azizi_1035
چهارشنبه 28 تیر 1391, 18:05 عصر
ببین منظورم اینه که Visual Studio کدوم خط رو زرد رنگ می کنه. مثلاً case 1 رو تست کن. احتمال می دم Parse مقدار null بر می گردونه.

yekta99
چهارشنبه 28 تیر 1391, 18:31 عصر
خطا ها مربوط به case های 4 به بعده ، خط هایی رو که بالا گذاشتم وقتی با break point برنامه رو اجرا می کنم زرد می کنه و این ارور رو نشون میده .

با سه case اول مشکلی ندارم ، بعد از این که داده ها رو با این سه تا کیس پر کردم و بعد یکی از کیس های 4و5و6 رو فراخوانی کنم ، اولین بار بدون مشکل اجرا میشه ولی اگه یکی از سه تا رو برای بار دوم فراخوانی کردم ، ایراد می گیره

tooraj_azizi_1035
پنج شنبه 29 تیر 1391, 21:01 عصر
عذر می خوام شما از همون اول خط ها رو مشخص کردین اما من حواسم نبود.
علت خطا اینه که ht همه نوع شیئی رو در خود نگه می داره و شما سعی داری فارغ از نوع شیء اونو تبدیل به Teacher کنی در حالی که اگه item یک Student باشه نمیشه اونو تبدیل به Teacher کرد باید ابتدا نوعش رو شناسایی بکنی اگه Teacher بود تازه بیای اونو بریزی تو متغیر teach:

foreach (DictionaryEntry item in ht)
{
if(item.Value is Teacher)
{

Teacher teach = item.Value as Teacher;
if (teach.TFamily.Contains(word))
{
Console.WriteLine("Teacher's family ={0}", teach.TFamily);
}
}
}