کنترل خطا و استثنا ها در جاوا
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش کنترل خطا و استثناها در زبان جاوا:
در این جلسه با مبحث کنترل خطا و استثناها (Exception Handling) در زبان جاوا آشنا میشوید. یکی از مهمترین مباحث میباشد که در زبانهای برنامه نویسی مختلف است به آن پرداخته میشود و باید به عنوان یک برنامه نویس این مبحث را خیلی خوب یاد بگیریم. در برنامههایی که مینویسیم احتمال به وجود آمدن خطا بسیار زیاد است. در واقع یک سری خطاها توسط برنامه نویس یا کاربر اتفاق میافتد. ما باید خطاها را کنترل کنیم که آسیبی بر اجرای برنامه نداشته باشد. در این جلسه با انوع خطا و کنترل کردن آنها آشنا میشوید.
برخی از این خطاها توسط ما کنترل نمیشود و امکان دارد در هر شرایطی اتفاق بیفتد، البته این خطاها خیلی کم هستند. ما یک سری خطا و استثنا داریم. خطا (Error) در واقع خطاهایی هستند که احتمال دارد در هر شرایطی اتفاق بیفتد. اما دسته دوم استثناها (Exception) هستند که ما میتوانیم آنها را کنترل کنیم. در واقع معمولا خطاهایی که رخ میدهد، امکان دارد علتش در نحوه نوشتار شما باشد مثلا i دستور if را به صورت بزرگ بنویسید یا سمیکالن ته خط را نگذارید. به این مدل خطا، خطاهای نحوی میگویند که قبل از کامپایل و اجرای برنامه این اتفاق رخ میدهد. دسته دوم خطاهایی هستند که در زمان اجرا رخ میدهند.
مثال:
اگر از کلاس file و fileReader استفاده کنیم خود سیستم اخطار میدهد که چون با فایلها داخل محیط سیستم عامل کار میکنیم احتمال بروز خطا وجود دارد. قبل از اینکه کامپایل صورت بگیرد خود برنامه هشدار میهد که شما خطا دارید. در اینجا FileReader یک استثنا است و امکان دارد عمل کند. پس آن را در try قرار میدهد و با دستور try-catch این استثنا را کنترل میکند. در واقع به آنها استثناهای چک شده میگویند. قبل از کامپایل و اجرای برنامه استثنا را کنترل میکند.
}
RuntimeException استثناهایی هستند که در زمان اجرا به وجود میآیند. برای کنترل استثناها میتوانیم از دستور try-catch استفاده کنیم. که دارای سه بلاک try، catch و finally است.
بلاک try: کدهایی که احتمال میدهیم در زمان اجرا خطایی رخ میدهد را در این قسمت قرار میدهیم. اگر نتواند دستورات را اجرا کند و خطا داشته باشند، قسمت بلاک catch اجرا میشود.
بلاک :catch در این بلاک دستوراتی را مینویسیم که در صورت خطا میخواهیم اجرا شوند. می تواند یک شی از کلاس Exceptio را به عنوان ورودی دریافت کند. این شی دارای اطلاعاتی در مورد خطا است، که شامل علت، نوع و زمان خطا میباشد و در اثر رخ دادن خطا محتوای خطا را نگهداری میکند. اگر نام شی را تنها بنویسیم به طور کامل خطا را نمایش میدهد و اگر از شی و متد getMessage() استفاده کنیم تنها نام خطا را نمایش میدهد.
بلاک finally: بلاکی است که در هر دو صورت اجرا میشود. یعنی اگر دستورات قسمت try اجرا شود، بعد دستورات finally اجرا میشود و اگر دستورات قسمت catch اجرا شود بعد از آن دستورات finally اجرا میشود. دستوراتی که میخواهیم در هر دو صورت اجرا شوند، چه try اجرا شود یا catch، را در این قسمت مینویسیم. مخصوصا موقعی که با دادههای داخل هارد دیسک یا حافظه جانبی کار میکنیم . مثل کار کردن با دیتابیسها و فایلها، عمل بسته شدن این ارتباط را در این قسمت مینویسیم.
package package1
import java.io.File
import java.io.FileReader
public class MainClass {
public static void main (string [] args) {
try{
int num1=24;
int num2=0;
int result=num1/num2;
System.out.println(result);
}
catch (Exception e ){
System.out.println(“Error :” + e.getMessage());
}
Finally{
System.out.println(“The End…”);
}
}
}
اگر بخواهیم به صورت خاص روی هر کدام از استثناها کار کنیم به جای اینکه از کلاس Exception استفاده کنیم، می توانیم از آن کلاس خاص خودش استفاده کنیم، 4 کلاس را در این مورد توضیح میدهیم.
کلاس ArithmeticExeption: اگر یک عمل ریاضی انجام میدهید و احتمال میدهید که ممکن است خطا رخ دهد. میتوانید از این روش استفاده کنید: در قسمت catch به جای کلاس Exception از این کلاس که مربوط به محاسبات ریاضی است، استفاده کنید.
package package1
import java.io.File
import java.io.FileReader
public class MainClass {
public static void main (string [] args) {
try{
int num1=24;
int num2=0;
int result=num1/num2;
System.out.println(result);
}
catch (ArithmeticeException e ){
System.out.println(“Error :” + e.getMessage());
}
Finally{
System.out.println(“The End…”);
}
}
}
کلاس NullPointerException: اگر اشاره گرهای null را در سیستم به وجود بیاورید، از این کلاس استفاده میشود. در این مثال یک رشته null یا هیچی داریم که میخواهیم طول این رشته را بدست آوریم. در اینجا یک خطا null رخ میدهد که از این کلاس در قسمت catch استفاده میکنیم.
package package1
import java.io.File
import java.io.FileReader
public class MainClass {
public static void main (string [] args) {
try{
String str = null;
System.out.println(str.lenght());
}
catch (NullPointerException e ){
System.out.println(“Error :” + e.getMessage());
}
Finally{
System.out.println(“The End…”);
}
}
}
کلاس NumberFormatException: زمانی که عمل فرمت بندی روی اعداد انجام میدهید و این قابلیت وجود ندارد. در این مثال یک رشته را میخواهیم به عدد تبدیل کنیم اما چون در مقدار متغیر str یک کاراکتر وجود دارد، امکان تبدیل کردن آن به عدد وجود ندارد به همین جهت یک خطا رخ میدهد.
package package1
import java.io.File
import java.io.FileReader
public class MainClass {
public static void main (string [] args) {
try{
String str = 12a3;
int num = Integer.parsInt(str);
System.out.println(str);
}
catch (NumberFormatException e ){
System.out.println(“Error :” + e.getMessage());
}
Finally{
System.out.println(“The End…”);
}
}
}
کلاس ArrayIndexOutOfBoundsException: این خطا مربوط به آرایهها میباشد. در این مثال یک آرایه 4 خانهایی داریم، اما میخواهیم خانه 10 آرایه را مقداردهی کنیم که خارج از محدوده آرایه میباشد. در ایجا خطا خارج از محدوده آرایه رخ میدهد.
package package1
import java.io.File
import java.io.FileReader
public class MainClass {
public static void main (string [] args) {
try{
int [] a = new int[4];
a[10] = 90;
}
catch (ArrayIndexOutOfBoundsException e ){
System.out.println(“Error :” + e.getMessage());
}
Finally{
System.out.println(“The End…”);
}
}
}
نکته: برای استثناها میتوانیم به صورت multi catch عمل استثنا را کنترل کنیم. اگر یک سری دستورات داشته باشیم که ترکیبی از استثناهای مختلف باشد. می توانیم برای هر دستور try چندین catch بنویسیم. مشروط به اینکه کلاسهایی که داخل catch تعریف میکنیم از انواع مختلف باشند. با این کار اگر کدی را در محدوده try بنویسیم که هر کدام از خطاهایی که در catch نوشته ایم رخ دهد، catchها را به ترتیب کنترل میکند و کلاسی که مربوط به خطا است را انتخاب و اجرا میکند.
دوست درسمنی عزیز، امیدواریم از این آموزش رایگان لذت برده باشید.
برای یادگیری این مبحث می توانید این درس را دانلود کنید و از فایل ها و ویدئو این بخش استفاده کنید.
شما عزیزان می توانید سوالات خود را در بخش انجمن پرسش و پاسخ مطرح کنید و همچنین منتظر انتقادات و پیشنهادات مفید شما در بخش نظرات هستیم تا ما را در کیفیت بهتر آموزش هایمان یاری کنید.
با امید موفقیت و شادی برای شما دوست درسمنی عزیز
انجمن برنامه نویسان جاوا
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.