آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

خاصیت کلید واژه finally در Try-catch

Reza  8 سال پیش  8 سال پیش
+1 0

سلام

ما چرا باید از 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 دقیقا چیه ؟!

 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
hossein_hr10  8 سال پیش
+4 0

 پاسخ صحیح

سلام دوست عزیز این رو با یک مثال خدمت شما میگم کد زیر رو در نظر بگیرین

 در اینجا در تقسیم ما یک عمل تقسیم به صفر برامون اتفاق میوفته و دستور 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 اجرا میشه

 
 
 
 
 
 
+2 0
یک مثال خوب استفاده از چنین وضعیتی، زمانی که شما یک ارتباط با بانک اطلاعاتی رو باز می‌کنید، و نتیجه یک عملیات را با دستور return به کاربر بر می‌گردونید . مسئله این که در این وضعیت چه جوری ارتباط با دیتابیس میبندین و منابع آزاد می‌کنین؟ اگر در حین عملیات بانک اطلاعاتی، خطایی رخ بده یا نده، و شما دستور آزاد سازی منابع و بستن ارتباط رو در داخل قسمت finally نوشته باشید، وقتی دستور return فراخوانی می‌شود، ابتدا منابع آزاد و سپس مقدار به خروجی بر می‌گردد. حکایت همین مثال بالا (8 سال پیش)
+1 0
ممنون ، خیلی جالب بود . نمیدونستم وقتی میخواد return کنه اول میاد finally رو اجرا میکنه . (8 سال پیش)
0 0
خواهش میکنم موفق باشید (8 سال پیش)
پاسخ به سوال 
sana ebadi  8 سال پیش
+1 0

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 

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

امیدوارم منظورو درک کرده باشید 

0 0
ممنون از همگی ، البته مشکل من وجود یا عدم وجود finally بود ، که در مثال شما و مثال خودم ، finally میتونه وجود نداشته باشه ، یعنی هر کدی که میخوایم در finally بنویسیم میتونیم بدون finally و بعد از catch بنویسیم ، ( چرا که از return استفاده نکردیم ) . پس در مثال خودم و شما میتونه دستورات finally خارج این کلید واژه اجرا بشه چون به هر حال کدپوینتر بهش میرسه . و اما فلسفه finally در مثال آقای Hossein_hr10 مشخص شد ( که از return استفاده شده ) و اونم اینکه : finally این تضمین رو به شما میده که 100 % اجرا میشه ، حتی اگه در try از return استفاده شده باشه . به این دلیل که کد پوینتر اینطور تفسیر میکنه و میگه : چون این کدها در try نوشته شده ، قبل از اینکه به هر دلیلی try تموم بشه ( حالا یا با تمام شدن کدها یا با دستور return ) ، من باید کدهای finally رو هم اجرا کنم و بعد تمام ( اینجاست که کدپوینتر ترتیب اجرای خطوط رو به هم میریزه و این فلسفه و خاصیت finally هست ) . (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .