تعداد بازدید: 1908

مدیریت استثنا ها در جاوا

به طور معمول خطاها یا توسط کاربران یا برنامه نویس و یا منابع فیزیکی اتفاق می افتد. اگر خطای اتفاق افتاده توسط برنامه نویس  قابل پیش بینی باشد در دسته استثنا ها قرار می گیرد.

ممکن است یه الگوریتم به ازای مقداری خاص به خطا بخورد . این مقدار خاص استثنا می شود. حال اگر خطا توسط منابع فیزیکی رخ دهد از دسترس برنامه نویس خارج خواهد بود و استثنا نیست مثل خطای سرریز بافر یا stackoverflow.

در استثنا ها شما کنترل خطا را به سیستم می سپارید. خوب گاهی شما فارغ از این که این خطا با چه ورودی اتفاق می افتد این مدیریت را به سیستم می دهید و گاها پیش بینی نوع خطا را می کنید.

به طور مثال در متد خودتون یکی یکی خطاها رو با دستور شرطی پیش بینی کنید و یا اینکه با دستورات ErrorHandling مدیریت خطا را به سیستم بسپارید.

این استثنا ها می تواند استثناهای از پیش تعیین شده و قابل پیش بینی از نظر نوع باشند (ArithmeticException , ArrayIndexOutOfBound , NullPointerException , … ) یا این که به دست شما ساخته شده باشد.

  • خطای تقسیم بر صفر یا عدد مبهم. (ArithmeticException)
  • وارد کردن اشتباه ورودی توسط کاربر. مثلا به جای داده عددی داده رشته وارد کند. (به دست شما ساخته شود)
  • استفاده از اندیسی برای آرایه بیشتر از طول آن.(ArrayIndexOutOfBound)

Exceptions یا استثناها در جاوا

استثنا ها مربوط به مبحث مدیریت خطاها در جاوا می باشند. طوری که ما خطاهای احتمالی را طوری پیش بینی کنیم که در صورت وقوع برنامه بسته نشود.

Exception ها یا استثناها می تواند در زمان کامپایل یا قابل تشخیص توسط کامپایلر (checked Exception) باشد یا در زمان اجرای برنامه (unchecked Exception) باشد.

Exception یک کلاس از پیش تعیین شده موجود در کتابخانه های جاوا است که فرزندان زیادی نظیر ArithmeticException (برای مدیریت خطاهای ریاضی) و یا ArrayIndexOutOfBound (برای مدیریت خطا زمانی که اندیس نامعتبر به آرایه داده شده) داره.

کلاس Exception متدهای زیادی برای استفاده داره به طور مثال :

  • public String getMessage : این متد جزئیات خطای رخ داده را بر می گرداند.
  • public Throwable getCause : این متد علت استثنایی که رخ داده را بر می گرداند.

try…catch

مدیریت استثناها و این که کد ها به ازای اجرای صحیح و در صورت برزو خطا چه اتفاقاتی برای آن ها بیفتد توسط try..catch مدیریت می شوند.

try{
        //execute if no error
}catch(Exception e) {
        //execute if have error
}finally{
        //execute at finall
}
  • try : به ازای اجرای صحیح از کد اتفاق می افتد.
  • catch : به ازای اجرای error از کد اتفاق می افتد.
  • finally : در پایان هر با اجرای try … catch اجرا می شود.

نکته : دقت داشته باشید در صورت برزو خطا یا همان اجرای catch از بلوک try…catch خارج می شود ولی از برنامه خارج نمی شود و سایر خط کد ها اجرا می گردد.

ما در بلوک catch یک instance از کلاس Exception داریم . بنا براین می توانیم از متد های این کلاس که در بالا گفته شد استفاده کنیم.

public class MyClass2 {
    public static void main(String args[]){
        MyClass2 self = new MyClass2();
        try{
            self.division(10,2);
            self.division(10,0);
            //System.out.println("it work");
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            System.out.println("finally call");
        }
        System.out.println("it work");
    }
    public void division(int a, int b) throws Exception {
        int result = a/b;
        System.out.println(result);
    }
}

خروجی قطعه کد بالا به شکل زیر می باشد.

5
/ by zero
finally call
it work

تعیین استثنا برای متد ها با استفاده از throw

با استفاده از کلمه کلیدی throw می توان یک استثنا برای متدمان انتخاب کنیم. به طور مثال متد division تنها اعدادی را به عنوان مقسوم علیه استفاده کند که مضربی از عدد ۵ باشند. (باقیمانده تقسیم بر ۵ برابر ۰ باشد)

public class MyClass2 {
    public static void main(String args[]){
        try{
            MyClass2.division(10,2);
            MyClass2.division(10,3);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
    public static void division(int a, int b) throws Exception {
        if(b%2 != 0)
            throw new Exception("invalid number");
        System.out.println(a/b);
    }
}

قطعه کد throw new Exception("invalid number"); یعنی ایجاد استثنا با استفاده از کلمه کلیدی throw و کلاس Exception که به عنوان ورودی متن قابل نمایش در خروجی برنامه رو می گیره.

نکته :‌ همان طور که در کد بالا مشاهده می کنید در زمان استفاده از متد division باید اون رو در بلوک try…catch قرار بدید تا استثنای ایجاد شده در صورت نیاز اعمال بشه.

ساخت کلاس استثنا custom Exception

ساخت یک custom Exception جدید با توجه به نیاز با استفاده از کلاس Exception انجام می پذیرد. برای این کار یک کلاس با نام مشخص که از کلاس Exception ارث بری می کنه میسازیم و در صورت نیاز متدها و متغیرهای جدید رو بهش اضافه می کنیم و یا متدهای پدرش رو override می کنیم.

منظور از custom Exception در این مقاله کلاس خاص از قبل تعریف شده نیست بلکه کلاس جدیدی است که توسط شما ساخته می شود.

مثال : مثلا کلاس استثنا تولید می کنیم با نام negativeNumber برای ورودی هایی که عدد منفی باشند.

public class negativeNumber extends Exception {
    public String getMsg(String msg){
        if(msg.length() == 0)
            return "please enter negative number";
        else
            return msg;
    }
}

کلاس Humen داریم که دو متد setAge() و getAge() رو داره که سن رو میگیره و در صورت نیاز میده. برای اضافه کردن شرط ارجاع به استثنا negativeNumber از کلمه کلیدی throw که قبل تر در بارش صحبت کردیم استفاده شده. همچنین از کلمه کلیدی throws برای اعلان خطا بکار رفته و محول کردن مدیریت خطا به متد فراخواننده استفاده می کنیم.

برای استفاده از کلاس customException در درون متد باید از کلمه های کلیدی throw و throws با هم استفاده کنیم و در نهایت متد را درون بلوک try…catch استفاده کنیم.

public class Human {
    public int age;
    public void setAge(int age) throws negativeNumber{
        if(age < 1)
            throw new negativeNumber();
        this.age = age;

    }
    public int getAge(){
        return this.age;
    }
}

حالا در کلاس MyClass3 میایم و یک فرد با نام ali از روی کلاس Humen می سازیم و سن رو بهش مقدار 0 میدیم و در بلوک try..catch قرارش می دیم تا در نهایت خروجی رو مشاهده کنیم.

Multple catch Block

می تونیم به ازای هر استثنا خاص از کلاس خاص خودش (ArithmetickException , …) یک catch داشته باشیم.

public class MyClass4 {
    public static void main(String args[]){
        try{
            MyClass4.division(10,2);
            MyClass4.division(10,5);
            MyClass4.division(10,-3);
            //System.out.println("it work");
        }catch (ArithmeticException e){
            System.out.println(e.getMessage());
        }catch (negativeNumber n){
            System.out.println("negative number");
        }finally {
            System.out.println("finally called");
        }
        System.out.println("it work");
    }
    public static void division(int a, int b) throws negativeNumber {
        if(b < 0)
            throw new Exception("negative number");
        int result = a/b;
        System.out.println(result);
    }
}

نکته مهم : دقت داشته باشید که از کلاس والد Exception به عنوان اولین catch استفاده نکنید. در این صورت کامپایلر خطایی با مذمون زیر به شما می دهد.

Exception has already been caught

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای مدیریت استثنا ها در جاوا

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *