خاصیت کلید واژه finally در Try-catch
سلام
ما چرا باید از finally در try - catch استفاده کنیم ، منظورم اینه که میشه کدهای داخل بلاک finally رو خارج اون هم نوشت .
به این دلیل که کدهای بعد از finally همیشه اجرا میشه ، چه خطا رخ بده و چه خطا رخ نده :
String str = null;
try {
int length = str.length();
G.printLog("A");
}
catch (Exception e) {
e.printStackTrace();
G.printLog("catch run");
} finally {// اگر خطا رخ بده یا نده در هر صورت کدهای بعد از این اجرا میشه
G.printLog("finally run");
}
G.printLog("** codes after finally **");
خروجی LogCat :
catch run
finally run
** codes after finally **
پس خاصیت fanally دقیقا چیه ؟!

سلام دوست عزیز این رو با یک مثال خدمت شما میگم کد زیر رو در نظر بگیرین
در اینجا در تقسیم ما یک عمل تقسیم به صفر برامون اتفاق میوفته و دستور 1 return اجرا نمیشه و ما از داخل متد خارج نمیشیم و دستورات finally و بعد finally هم اجرا میشن یعنی کلمه ok و can you reach here داخل خروجی برای ما چاپ میشه و return -1 میشه
public static int test() { try { for (int i=10;i>=0;i--){
Log.i("LOG",""+10/i);
} return 1; } catch {
Log.i("LOG","Error"); } finally {
Log.i("LOG","ok"); } Log.i("LOG","can you reach here?"); return -1; }
حالا اگر کد رو طوری تغییر بدیم که خطای تقسیم به صفر اتفاق نمیوفته مثل زیر
public static int test() { try { for (int i=10;i>=1;i--){ Log.i("LOG","" + (10/i));
} return 1; } catch {
Log.i("LOG","error");
} finally {
Log.i("LOG","ok"); } Log.i("LOG","can you reach here?"); return -1; }
در اینجا دیگه اون خطا برای ما اتفاق نمیوفته حلقه for به اتمام میرسه و دستور return 1 بعدش اجرا میشه و از تابع خارج میشیم اما و اما نکته مهم اینجاست که قبل از خارج شدن از تابع دستورات داخل finally هم اجرا میشند و این بار فقط توی خروجی برای ما عبارت ok رو مینویسه و دیگه نه دستور چاپ can tou reach here برای ما نوشته میشه و نه دستور return -1 اجرا میشه

Log.i("Log" , "This is my first output!");
try {
int numberOne = 10;
int numberTwo = 0;
int result = numberOne / numberTwo;
Log.i("Log" , result);
} catch (ArithmeticException myProblem) {
Log.i("Log" , "myProblem");
} finally {
Log.i("Log" , "This is my final output!");
}
}
خب اینجا کدی که من نوشتم رو براتون توضیح میدم امیدوارم منظور و تا حدودی متوجه شین .
همونطور که میبینی من اول یه تیکه کد نوشتم که وظیفش اینه که تو لاگ کت بهم "This is my first output! " رو نمایش بده .
بعدش اون کدهایی که قبلا توی برنامه نوشته بودیم و برناممون به خاطر اونا کرش کرده بود رو توی try نوشتیم .
بعدش بلافاصله اومدیم و از دستور catch استفاده کردیم (و اون exception که قبلا برامون اتفاق افتاده بود رو اینجا مطرح میکنیم (که اینجا خطای divide by zero )) هست رو مینویسم و یه اسم براش میزاریم .و وظیفه اش اینه که اگه توی کدای مربوط به try مشکلی وجود داشت اونو به کاربر بگه
و از کرش کردن برنامه جلوگیری کنه . در اخر اومدیو از finally استفاده کردیم چرا که این دستور چیزی رو که میخوایم در اخر اجرا بشه رو نمایش بده .
که ما این کد
This is my final output! رو براش نوشتیم که در اخر نمایش بده .
و خرجی این هست
This is my firstOutPut! //دستور اول
java.lang.AritheticException : /by zero //دستورات try که مشکل داره و بهمون مشکلشو گفت (تقسیم بر صفر)
This is my final output! //دستور finally
و با اینکه برناممون مشکل داشت ولی کرش نکرد. و تمام
امیدوارم منظورو درک کرده باشید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .