View Full Version : سوال: تفاوت بین throw و try{} catch{}
deCODER-
شنبه 19 اردیبهشت 1394, 22:29 عصر
درود ...
2 تا سوال داشتم :
1) تفاوت بین throw و catch چیه ؟
2) مگه عملگر new آدرس شی رو برگشت نمیده؟پس باید یه متغیری این آدرس رو تو خودش ذخیره کنه دیگه !! پس چرا برای Throw داریم:
new throw Exception()
و در سمت چپ هیچ متغیری وجود نداره تا آدرسی که new برگشت میده رو ذخیره کنه !!!! ؟
ارادتمند ...
محمد فدوی
یک شنبه 20 اردیبهشت 1394, 10:23 صبح
سلام.
۱. throw یه استثنا (Exception) رو پرتاب میکنه و توی بلوک try-catch این استثنا قاپیده (catch) میشه. برای مثال:
// In some method:
throw new Exception();
try {
callSomeMethod();
} catch (Exception ex) {
System.out.println("Exception catched");
}
همون استثنایی که توی کد بالا پرتاب میشه توی کد پایین دریافت میشه و در حقیقت شیء ex همون شیءای هست که توی کد بالا پرتاب شده.
۲. درسته عمگر new یه یک شیء رو توی حافظه میسازه. ولی لزومی نداره در ظاهر ما اونو توی یه متغیر ذخیره کنیم. مثلا موقع استفاده از کلاس StringBuilder میتونیم اینجوری عمل کنیم:
String msg = new StringBuilder().append("I'm ").append("Java ").append(8).toString();
System.out.println(msg);
خب اینجا شیءای که توسط new StringBuilder ساخته شد توی هیچ متغیری در ظاهر قرار نگرفت ولی کار خودش رو کرد و به موقع هم از حافظه توسط سیستمجمعکنندهی زبالهی جاوا (GC) حذف خواهد شد.
و در ضمن هیچ ایرادی نداره که موقع پرتاب کرده استثناها اول اونارو توی یه متغیر قرار بدیم و بعد پرتاب کنیم. هرچند اینکار معمولا بیدلیل خواهد بود:
public static double divide(double numerator, double divisor) throws IllegalArgumentException {
if(divisor == 0) {
IllegalArgumentException iaex = new IllegalArgumentException("Divide by Zero!");
throw iaex;
}
return numerator / divisor;
}
try {
double foo = divide(4, 0)
} catch (IllegalArgumentException iaex) {
System.out.println(iaex.getMessage);
}
در صورتی که قراردادن استثنا در یه متغیر توی این مثال کاملا بیدلیل بود!
موفق باشی.
deCODER-
یک شنبه 20 اردیبهشت 1394, 11:07 صبح
بابت توضیحاتتون ممنون اما من بازم قسمت دوم رو متوجه نشدم!
اونجور که من یاد گرفتم ، new یک آدرسی رو برمیگردونه.(آدرس شی در حافظه).مثلا در دستور زیر:
ClassName e = new ClassName();
آدرس شی به متغیر e اختصاص پیدا می کنه و متغیر e میشه یک ارجاع به شی!وچون new یک آدرس برمیگردونه پس باید متغیری وجود داشته باشه تا اونو ذخیره کنه دیگه !!!
؟؟؟
ahmad.mo74
یک شنبه 20 اردیبهشت 1394, 18:14 عصر
سلام.
از throw در جایی استفاده میکنید که میخواید یه exception رو پرتاب کنید و از catch برای گرفتن exception ای که پرتاب شده استفاده میکنید. از throws هم برای پاس دادنش به لایه بالاتر (تو امضای تابع نوشته میشه). اصلا اگر throws وجود نداشت اونوقت دیگه try/catch معنی نداشت.
ما توی جاوا 2 نوع exception داریم : Checked Exceptions (توی زبان های مثل #C وجود نداره) مثل IOException و Unchecked Exceptions مثل NullPointerException.
Checked Exception ها از کلاس Exception مشتق شدن و Unchecked ها از کلاس RuntimeException یا Error.
فرقشون تو نحوه مدیریتشونه.
وقتی جایی یه unchecked exception پرتاب شده باشه، کامپایلر شمارو مجبور به catch کردن یا throws کردنش نمیکنه.
اما وقتی checked exception باشه، حتما یا باید اونو catch کنید یا به لایه های بالاتر پاس بدید.
هیچ اجباری برای اینکه در جایی حتما باید از checked exception استفاده بشه یا از unchecked وجود نداره و کاملا به سلیقه برنامه نویس و معماری برنامش ربط داره.
خوبی استفاده از checked exception ها اینه که میتونید اون رو به لایه های بالاتر پاس بدید تا در جایی که امکانش هست اون رو هندل کنید (مثلا تو لایه view و ui برنامه).
خوبی دیگش اینه که شما و یا احتمالا افرادی که میخوان از api تون استفاده کنن و یا تیمی که رو لایه های بالاتر کار میکنه رو مجبور به این میکنه که اررور هارو نادیده نگیرن و بیشتر حواسشون به چک کردن خطاها باشه تا کد سالم تری رو تولید کنن.
ahmad.mo74
یک شنبه 20 اردیبهشت 1394, 20:35 عصر
درباره new هم اینو ببین :
http://stackoverflow.com/questions/17014747/diffrence-between-new-operator-in-c-and-new-operator-in-java
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.