وبلاگ سید جلال سیدیزدی

تمرین بیست و پنجم

چهارشنبه, ۷ خرداد ۱۳۹۳، ۰۷:۵۰ ق.ظ

سلام دوستان

تمرین 25 در مورد Exception و Assertion است.


تمرین های 12.33 تا 12.39 از کتاب را انجام دهید.


تمرین 12.33:

در پروژه ی address-book-v3t یک کلاس جدید برای exceptionی از نوع checked با نام DuplicateKeyException تعریف کنید. این exception در صورتی که هر یک از فیلدهای کلید پارامتر واقعی متد addDetails از قبل مورد استفاده باشند باید توسط این متد پرتاب شود . کلاس DuplicateKeyException باید جزیات کلید یا کلیدهای خاطی را ذخیره کند. تغییرات لازم را در کلاس رابط کاربر برای catch کردن و گزارش exception انجام دهید.


تمرین 12.34:

به نظر شما DuplicateKeyException باید checked باشد یا unchecked؟ دلایل خود را بیان کنید.


تمرین 12.35:

پروژه address-book-assert را باز کنید. در کلاس AdressBook همه ی دستورات assert را بیابید و توضیح دهید چه چیزی توسط آنها چک می شود و چرا؟


تمرین 12.36:

کلاس AddressBookDemo شامل چندین متد تست است که متدهای AdressBook را که دارای دستور assert است را فراخوانی می کنند. در کلاس AddressBookDemo  همه ی تست ها را توضیح دهید. سپس هر یک از آنها را انجام دهید. آیا هیچ خطای assert روی می دهد؟ اگر این طور است توضیح دهید چرا.


تمرین 12.37:

متد changeDetails از AddressBook در حال حاضر دستور assert ندارد. دستور assert ی که می توان اضافه کرد این است که تعداد اقلام در ابتدا و انتهای متد یکسان است. دستورات لازم را برای انجام این ادعا اضافه کنید. سپس متد testChange از کلاس AddressBookDemo را اجرا کنید. به نظر شما آیا این متد باید یکسان بودن اندازه map و متغیر numberOfEntries را نیز چک کند؟


تمرین 12.38:

فرض کنید تصمیم گرفته ایم که علاوه بر نام و شماره تلفن با آدرس نیز بتوان در دفترچه جستجو کنیم. اگر دستور زیر را به متد addDetails اضافه کنیم، آیا هیچ یک از دستورات assertion تولید خطا می کند؟ امتحان کنید.

تغییرات لازم را در AddressBook اضافه کنید به گونه ای که هیچ یک از دستورات assertion خطا ندهد.

book.put(details.getAddress(), details);

تمرین 12.39:

ContactDetails یک شیء تغییرناپذیر (immutable) است. چرا که هیچ متد mutator ی ندارد. این موضوع در هماهنگی داخلی AddressBook چقدر مهم است؟ مثلاً اگر کلاس ContactDetails متد  setPhone داشت چه مشکلی امکان داشت روی دهد؟

آزمایشی ترتیب دهید که مشکلات ممکن را نشان دهد.



مهلت ارسال: جمعه 9 خرداد ساعت 21

با تاخیر: شنبه 10 خرداد ساعت 20 یکشنبه 11 خرداد ساعت 9


موفق باشید.

  • ۹۳/۰۳/۰۷

نظرات  (۱۸)

سلام استاد خسته نباشیدگ
استاد میشه وقت این تمرین  یکم تمدید کنید؟
لطـــــــــفــــا
یکمی

پاسخ:
سلام ممنون
تمدید شد.
موفق باشید.
سلام
استاد کلاس NoMatchingDetailsException در ورژن v3t دقیقا چکار میکنه؟؟؟؟
میشه یه توضیحی بدید؟؟؟
ممون
پاسخ:
سلام
فعلاً هیچ کار!
کامنت کلاس:        Capture a key that failed to match an entry in the address book

در تمرین های 12.28 و 12.29 قرار است از این استثناء در متدهای addDetails و changeDetails استفاده شود.


موفق باشید.
سلام استاد، در تمرین 12.33 داخل کلاس Exception جدید یعنی DuplicateKeyException باید چی بنویسیم؟
پاسخ:
سلام
اصلاً خود سوال همین است!
کتاب و اسلایدها رو مطالعه کنید و بعد فکر کنید.
موفق باشید.
سلام
پس با throws کردن خطا پرتاب نمی شه فقط اعلام می کنیم که این متد قراره خطا رو پرتاب کنه درسته؟ و بعد  یا با دستور throw اونو پرتاب می کنیم یا با try - chatch مدیریت این خطا رو به متدی می سپاریم که اون متد در داخل خودش throw کرده درسته؟


بعد استاد ببخشید این  متد DuplicateKeyExceptionباید چه خطایی رو بیان کنه؟
پاسخ:
سلام

"پس با throws کردن خطا پرتاب نمی شه فقط اعلام می کنیم که این متد قراره خطا رو پرتاب کنه درسته؟ و بعد  یا با دستور throw اونو پرتاب می کنیم"
تا اینجا درسته ولی بقیه اش درست نیست.

مدیریت خطا یعنی اینکه متدی که ممکنه استثناء پرتاب کنه رو در بلاک try قرار دهیم. و اگر استثناء روی داد کدهای قسمت catch اجرا می گردد.
کتاب رو مطالعه کنید.
موفق باشید.

سلام استاد . من کا این متد رو نمی فهمم؟مخصوصا خط دوم رو؟

 private boolean consistentSize()
    {
        Collection<ContactDetails> allEntries = book.values();
        // Eliminate duplicates as we are using multiple keys.
        Set<ContactDetails> uniqueEntries = new HashSet<ContactDetails>(allEntries);
        int actualCount = uniqueEntries.size();
        return numberOfEntries == actualCount;
    }
پاسخ:
سلام.
خط دوم که کامنت است!

ابتدا مقادیر book را که یک map است در یک کالکشن قرار داده اشت. (کالکشن به معنای خاص؛ شی ای از کلاس Collection).
سپس یک HashSet ایجاد کرده و کالکشن رو به سازنده اش داده تا تکراری ها رو حذف کرده و در شی set با نام  uniqueEntries قرار دهد.
خط بعد اندازه set رو در actualCount قرار داده و در آخر ادعا کرده که این مقدار باید با numberOfEntries مساوی باشد.
موفق باشید.
سلام، خسته نباشید
میشه صورت پروژه پایانی رو در وبلاگ قرار بدین؟
ممنونم
پاسخ:
سلام ممنون
انجام شد.
موفق باشید.
سلام، خسته نباشید
میشه صورت پروژه پایانی رو در وبلاگ قرار بدین؟
ممنونم
پاسخ:
سلام ممنون
انجام شد.
موفق باشید.
سلام استاد
فرق این سه تا چیه؟
1-زمانی که throws می کنیم
2- زمانی که throw می کنیم
3- زمانی که با try -chatch خطا را مدیدریت می کنیم
پاسخ:
سلام
دوتای اول به متد سرور مربوط می شود. و مورد آخر به متد کلاینت.

  • عبارت throws در header متد سرور نوشته می شود تا اعلان کند که این متد exception پرتاب می کند.
  • دستور throw برای پرتاب کردن استثناء استفاده می شود. معمولاً جلوی آن چیزی شبیه new Exception می نویسیم و باز معمولاً در بلاک if قرار دارد. یعنی تحت شرایطی استثناء پرتاب می شود.
  • در متد کلاینت اگر بخواهیم از متدی استفاده کنیم که اعلان کرده که استثناء پرتاب می کند (با عبارت throws در header اش) ، باید این فراخوانی را در بلاک try قرار دهیم و کدهای لازم برای گزارش خطا و/یا رفع آن را در قسمت catch قرار دهیم.

موفق باشید.

استاد، واقعا ممنون
سلام لطفا جواب تمرین 24 رو قرار بدید؟
پاسخ:
سلام
از لینک زیر دریافت کنید.
employeeManager
موفق باشید.
سلام.خسته نباشید
ببخشید کلاس NoMatchingDetailsException چیکار میکنه؟؟؟؟
پاسخ:
سلام ممنون
توضیح داده شد.
موفق باشید.
سلام،میشه یک ذره صورت تمرینا رو توضیح بدید؟ خیلی مبهم اند، مخصوصا تمرین 12.33
پاسخ:
سلام
انجام شد.
موفق باشید.
سلام استاد
وقتی یک فیلد private  و static  باشه، مستقیما با اسم کلاس نمیشه ازش استفاده کرد چون public  نیست
ولی همون فیلد رو میتوان داخل یک متد استاتیک ازش استفاده کرد و با اسم کلاس اون متد را فرا خواند
یعنی در حالت دوم ما بدون ساختن شی یک فیلد داشتیم چرا؟
پاسخ:
سلام
درسته. متغیر استاتیک یا متغیر کلاس یعنی همین. متغیر مربوط به کلاس است و بدون ایجاد شی وجود دارد.
موفق باشید.
سلام استاد
میشه در مورد تمرین ها توضیح بدید؟
ممنون
پاسخ:
سلام
انجام شد.
موفق باشید.
در ضمن معنی try out(در رابطه با تمرین 12.36) چیه؟
                                                            and then try out each of the test 
methods. Are any assertion errors generated? If so, do you understand why
پاسخ:
try out
put to a test, examine
امتحان کنید.
سلام استاد.
خسته نباشید.
دستور assert رو در برنامه مینویسم اما اجرا نمیشه.یعنی شرطی رو که در assert مینویسم نادیده میگیره و میره خط بعد.میشه توضیح بدین.(واضح تر از سایت هایی که خوندم!!!)
ممنون.
پاسخ:
سلام ممنون
باید assertion رو فعال کنید.
در cmd با اضافه کردن ae- در جلوی java.
در نت بینز به مسیر زیر بروید
Run -> Set Project Configuration -> Customize
و در قسمت VM Options عبارت بالا را بنویسید.
موفق باشید.

باز هم سلام.
استاد تمرین 12.35 رو میشه تو یه فایل word توضیح داد؟
پاسخ:
سلام
بله.
موفق باشید.
سلام استاد.
همه تمرین ها رو باید در یک پروژه انجام بدم یا بعد از هر تمرین، اون رو رخیره و دوباره پروژه جدیدی رو باز کنم و تمرین رو روی اون انجام بدم؟ 
پاسخ:
سلام
تمرین های مرتبط رو در صورت امکان می تونید در یک پروژه انجام دهید.
موفق باشید.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی