مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آموزش رفع مشکل اجرا شدن try و اجرا نشدن finally در جاوا

لطفا به کد زیر دقت نمایید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
public class shutDownHooksDemo {
	public static void main(String[] args) {
		for(int i=0;i<5;i++)
		{
			try {
				if(i==4) {
					System.out.println("Inside Try Block.Exiting without executing Finally block.");
					System.exit(0);
				}
			}
			finally {
				System.out.println("Inside Finally Block.");
			}
		}
	}
}	

ممکن است فکر کنید که خط println در داخل بلوک finally 5 بار اجرا خواهد شد. اما اگر برنامه را اجرا کنید خواهید دید که این خط 4 بار اجرا می شود. در وقتی که حلقه برای بار پنجم اجرا می شود خط System.exit فراخوانی می شود و بلوک finally دیگر اجرا نخواهد شد. زیرا متد exit باعث خارج شدن از برنامه خواهد شد. نحوه کار کردن متد exit به این شکل است که thread اجرا کننده برنامه را از اجرا باز می دارد در این صورت حتی بلوک finally که بعد از try آمده و باید اجرا شود نیز اجرا نمی شود. وقتی که متد System.exit فراخوانی می شود JVM یا ماشین مجازی جاوا قبل از این که اجرای برنامه را تمام کند پاکسازی های زیر را انجام می دهد.

    • اول این که همه ی shutdown hook هایی را که در Runtime.addShutDownHook ثبت شده اند را اجرا می کند. این کار همه ی منابع گرفته شده توسط برنامه را آزاد می کند.
    • پاکسازی دومی مربوط به finalizer ها است. Finalizer مورد نظر یا System.runFinalizersOnExit است و یا Runtime.runFinalizersOnExit می باشد. استفاده از finalizerها مدتی است که منسوخ شده است. وظیفه finalizer است است که اگر شیئی توسط دیگر اشیا دستکاری شده است و این شی از بین نرفته است را طوری مدیریت کند که سیستم دچار بن بست یا Dead lock نشود. به مثال زیر توجه کنید.
public class shutDownHooksDemo {
	public static void main(String[] args) {
		for(int i=0;i<5;i++)
		{
			final int final_i = i;
			try {
				Runtime.getRuntime().addShutdownHook(
					new Thread() {
						public void run() {
							if(final_i==4) {
								System.out.println("Inside Try Block.Exiting without executing Finally block.");
								System.exit(0);
							}
						}
					}
				);
			}
			finally{
				System.out.println("Inside Finally Block.");

			}
		}
	}
}	

اگر کد بالا را اجرا کنیم. خواهیم دید که در همه حالت ها finally اجرا می شود و در قسمت آخر که System.exit فراخوانی می شود پیام داخل try چاپ خواهد شد .Itpro باشید

نویسنده: مهدی عادلی فر

منبع: انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات