PDA

View Full Version : مبتدی: تفاوت بین throw و throws



esmaeilbf
جمعه 28 تیر 1392, 17:07 عصر
فرق این دوتا چی هست و چه موقع استفاده باید کرد؟

spiderman200700
جمعه 28 تیر 1392, 20:05 عصر
یه مثال میزنم. اگه همچنان مشکلی بود بفرمایید:
public void send() throws Exception {
throw new Exception("Error");
// another codes
}

esmaeilbf
جمعه 28 تیر 1392, 20:07 عصر
لطفا یه مقداری توضیح بفرمایید:متفکر:

cups_of_java
جمعه 28 تیر 1392, 20:30 عصر
throw وقتی شما می خواین یک Exception رو پرتاب کنید استفاده میشه. در واقع عمل پرتاب خطا با throw انجام میگیره و یک دستور هستش.

throws یک کلمه کلیدی هست که توی اعلان متدها استفاده میشه (همون خط اول بعد از آرگومان هاش) که نشون میده این متد ممکن هست که خطا پرتاب کنه. در واقع انواع خطاهایی که اون متد پرتاب می کنه رو معرفی می کنه تا کامپایلر ایراد نگیره اگر اون خطا ها داخل اون متد catch نشده یاشن.

maktoom
جمعه 28 تیر 1392, 23:40 عصر
سلام
احساس کردم کمی آکادمیک تر(!) باید توضیح داد. این شد که رفتم کتاب هربرت شیلد رو برداشتم:

throw
استثنا ها را با استفاده از عبارت throw پرتاب می کنند. فرم کلی throw در ذیل نشان داده شده است:
throw ThrowableInstance;
ThrowableInstance، باید شیئی از نوع Throwable یا زیر کلاسی از آن باشد. انواع داده های پایه همچون int یا char و کلاس های غیر Throwable همچون String و Object را نمی توان به عنوان استثنا به کار برد. دو روش برای دریافت هر شئ Throwable وجود دارد: استفاده از یک پارامتر در عبارت catch یا ایجاد آن با عملگر new.
جریان اجرای برنامه بلافاصله بعد از عبارت throw متوقف می شود. عبارت بعدی اجرا نمی شود. نزدیک ترین بلوک try بررسی می شود تا مشخص شود که دارای عبارت catch متناظر با نوع استثنا می باشد یا خیر. چنانچه وجود داشته باشد کنترل به آن عبارت انتقال می یابد. در غیر اینصورت عبارت try بیرونی تر بررسی شده و این کار به همین صورت ادامه می یابد. اگر عبارت catch متناظری پیدا نشود در آنصورت مدیر پیش فرض پاسخگویی به استثناها اجرای برنامه را متوقف کرده و اطلاعات پشته را نمایش می دهد.
بسیاری از استثناهای توکار زمان اجرا حداقل دو constructor دارند: یکی بدون پارامتر و یکی با یک پارامتر رشته ای. وقتی از نوع دوم استفاده شود آرگومان مشخص کننده رشته ای است که شرح استثنا را بیان می کند. این رشته هنگام استفاده از شئ به عنوان آرگومان ()print یا ()println نمایش داده می شود. با استفاده از فراخوانی ()getMessage هم که توسط Throwable تعریف شده است، قابل دسترسی است.

throws
اگر متدی قابلیت تولید تولید استثنایی را که خود مدیریت نمی کند داشته باشد، در آن صورت باید این رفتار را برای روتین های فراخوانی خود مشخص کند تا تمام آنها بتوانند از خودشان در مقابل استثنا محافظت کنند. این کار با افزودن throws به تعریف متد انجام می شود. throws انواع استثناهایی را مشخص می کند که متد ممکن است به روتین های دیگر پرتاب کند. تمام استثناهایی که ممکن است متدها پرتاب کنند(به غیر از استثناهای نوع Error یا RuntimeException یا زیر کلاس های آنها) می بایست در throws مشخص شوند. اگر اینچنین نشود برنامه با خطای زمان کامپایل متوقف خواهد شد.
فرم کلی تعریف متد با عبارت throws به صورت زیر است:
type method-name(parameter-list) throws exception-list
{
//body of method
}
exception-list فهرست استثناهاست که با کاما از یکدیگر جدا می شوند.

موفق باشید./

fbcomputer
چهارشنبه 09 مرداد 1392, 11:32 صبح
سلام، منم یه سوال تو این زمینه دارم
وقتی از throws استفاده میکنیم توی اون تابع باید حتما از try استفاده بشه؟

cups_of_java
چهارشنبه 09 مرداد 1392, 14:33 عصر
نه!
کسی که اون تابعی که throws داره رو فراخوانی می کنه باید یا catch‌ داشته باشه براش یا اینکه خودش throws بزاره!

javaphantom
چهارشنبه 09 مرداد 1392, 20:36 عصر
نه!
کسی که اون تابعی که throws داره رو فراخوانی می کنه باید یا catch‌ داشته باشه براش یا اینکه خودش throws بزاره!

درصورتی که exception ی که throws کردید از نوع runtime exception باشد نیازی ندارید که حتما آن exception را catch کنید.
فقط exception‌ های check رو باید catch کرد.

esmaeilbf
پنج شنبه 10 مرداد 1392, 03:28 صبح
در ادامه توضیحات دوستان:
دو نوع Exception در جاوا داریم :
1-Checked exception
2-unchecked exception

فرق اینا چیه:
1.کلاس هایی که از throwable مشتق شدن (به جزRuntimeException) رو checked میگیم زیرا در زمان کامپایل شدن بررسی میشن مثل:IOException,SQLException ,....
2.کلاس هایی که زیرکلاسی از RuntimeException هستند مثل :ArithmeticException , ArrayIndexOutOfBoundsException ,غیره که در زمان کامپایل بررسی نمیشن و کامل کامپایل میشن ولی در زمان اجرا مشکل پیدا می کنند.

cups_of_java
پنج شنبه 10 مرداد 1392, 12:01 عصر
اون دوتا همون Checked و UnChecked ها هستن دیگه. حرف هر دوتای شما درسته. یعنی جاوا throws رو برای Checked ها گذاشته (یعنی اونایی که باید check بشن و از دسته خطاهای زمان اجرا نیستن)
سر این موضوع Checked Exceptionها که تو جاوا و زبان های کمی وجود داره و به خاطر قابلیت اطمینان بالا بوجود اومد، دعوای های زیادی اون قدیما شد که میگفتن این Checkedها باعث میشه برنامه نویس خیلی جاهای کد مجبور شه catch بزاره و این کد رو پر از try/catch میکنه که پیچیدگی منفی ای واسه کد حساب میشه.

fbcomputer
شنبه 12 مرداد 1392, 14:53 عصر
ممنون از همه ی دوستان که جواب دادین، حالا ParseException از کدوم نوعه؟؟؟

cups_of_java
شنبه 12 مرداد 1392, 16:45 عصر
قاعدتن باید Runtime باشه و بنابراین Unchecked ولی
Javadocاش رو ببین از چه کدوم کلاس ارث بری کرده دیگه
اینو توی محیط برنامه نویسیت هم می تونی بفهمی