CodeGym /وبلاگ جاوا /Random-FA /جاوا پرتاب استثنا
John Squirrels
مرحله
San Francisco

جاوا پرتاب استثنا

در گروه منتشر شد
به هر طرف که می رویم اتفاقات غیرقابل پیش بینی در انتظارمان است. زلزله، اقدامات غیرمنطقی مردم، شهاب‌سنگ‌ها... یا چیز ساده‌تر - یک لامپ می‌سوزد، یک کارت بانکی مغناطیسی می‌شود، یک گیج بنزین می‌شکند. ما نمی توانیم رویدادهای غیرقابل پیش بینی را غیرفعال کنیم، اما حداقل می توانیم تا حدی برای آنها آماده باشیم. یعنی باید سازوکارهای خاصی را برای مقابله با آنها آماده کنیم. در دنیای برنامه نویسی، به طور خاص در زبان جاوا، رویدادهایی که مانع از عملکرد عادی یک برنامه می شوند، استثنا نامیده می شوند و مکانیسم های جلوگیری از خرابی برنامه ها را مدیریت استثنا می گویند. بنابراین، هنگامی که یک رویداد غیرمنتظره در یک برنامه رخ می دهد، مانند تقسیم بر صفر، باید یک استثنا را "پرتاب" کند. مدیریت استثناها جنبه مهمی از برنامه نویسی جاوا است که به توسعه دهندگان کمک می کند تا خطاها و استثناهایی را که ممکن است در حین اجرای یک برنامه رخ دهد مدیریت کنند. در این مقاله، ما بر روی یکی از مفاهیم اساسی مدیریت استثنا تمرکز خواهیم کرد: کلمه کلیدی پرتاب جاوا و نحوه استفاده از آن برای ایجاد استثنا.

استثنا در جاوا چیست؟

یک استثنا رویدادی است که در حین اجرای برنامه رخ می دهد و جریان عادی دستورات برنامه را مختل می کند. هنگامی که یک استثنا رخ می دهد، اجرای برنامه متوقف می شود و پیام خطا در کنسول نمایش داده می شود. در جاوا دو نوع استثنا وجود دارد: تیک دار و بدون علامت. استثناهای بررسی شده در زمان کامپایل بررسی می شوند و کامپایلر اطمینان حاصل می کند که آنها توسط روش فراخوانی شناسایی یا اعلام شده اند. از سوی دیگر، استثناهای بدون علامت در زمان کامپایل بررسی نمی شوند و می توان آنها را گرفت یا رها کرد. در اینجا نمونه ای از کدها وجود دارد که ممکن است در آن خطایی رخ دهد، اما کامپایلر آن را رد می کند.
public class Factorial {
   public static long getFactorial(final int number) {
           long fact = 1;
           for (int i = 1; i <= number; i++) {
               fact = fact * i;
           }
           return fact;
   }

   public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }

}
این هم خروجی برنامه:
1 -4249290049419214848
برنامه به درستی خارج شد، اما نتیجه نادرستی ایجاد کرد. در حالت اول، چون آرگومان تابع منفی بود و فاکتوریل برای اعداد منفی کار نمی کند. در مورد دوم، نتیجه اشتباه بود، زیرا عدد برای شمارش فاکتوریل آن در محدوده نوع طولانی بسیار بزرگ است. در اینجا یک مثال دیگر وجود دارد. بیایید برنامه ای بنویسیم که در آن یک عدد را بر عدد دیگر تقسیم کنیم.
public class DivisionExample {

       public static void main(String[] args) {
           int a = 10;
           int b = 0;
           int result = divide(a, b);
           System.out.println(result);
       }

       public static int divide(int a, int b) {
           return a / b;
       }
}
در این مثال، یک ArithmeticException پرتاب می شود زیرا متغیر b صفر است. با این حال، این خطا کنترل نمی شود، بنابراین برنامه با وضعیت نادرست خارج می شود.

نحوه پرتاب استثنا در جاوا

در جاوا، استثناها نیز اشیا هستند، بنابراین یک استثنا درست مانند یک شی Exception جدید ایجاد می شود. یک استثنا در یک برنامه با استفاده از دستور throw ایجاد می شود. معمولاً این دو عملیات (ایجاد شی و پرتاب یک استثنا) در یکی ترکیب می شوند:
throw new Exception("error…");
کلمه کلیدی throw در جاوا برای ایجاد یک استثنا از یک متد یا بلوک کد زمانی که یک خطا یا شرایط استثنایی رخ می دهد که برنامه نمی تواند در زمان اجرا آن را مدیریت کند، استفاده می شود. جریان برنامه به نزدیکترین بلوک catch هدایت می شود. این بلوک می تواند استثنا را مدیریت کند.

مثالی از استفاده از کلمه کلیدی "پرتاب".

برای نشان دادن کارایی کلمه کلیدی throw در جاوا، مثالی می زنیم. بیایید روشی برای محاسبه فاکتوریل یک عدد بنویسیم. اگر عدد منفی باشد، نمی توان آن را محاسبه کرد، بنابراین باید یک استثنا ایجاد شود. به طور مشابه، اگر عدد خیلی بزرگ باشد، نتیجه فاکتوریل از حداکثر اندازه یک نوع طولانی بیشتر خواهد شد و یک استثنا دیگر ایجاد خواهد شد. در اینجا پیاده سازی روش را داریم:
public Class Factorial {

public static long getFactorial(final int number) {
   if ((number >= 0) && (number < 21)) {
       long fact = 1;
       for (int i = 1; i <= number; i++) {
           fact = fact * i;
       }
       return fact;
   } else {

//throw new exception here
       throw new IllegalArgumentException("THe argument isn't legal");
   }
}

 public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }
}
در این مثال، اگر مقدار عدد منفی باشد، از کلمه کلیدی throw برای پرتاب نمونه ای از کلاس IllegalArgumentException استفاده می شود . اگر برنامه را اجرا کنید، پیام "The argument isn't legal" روی کنسول نمایش داده می شود. اجرای برنامه متوقف خواهد شد.

بدون خطا دیگر: گرفتن یک مثال استثنا

حال بیایید مثال دوم را با تقسیم بر صفر به یاد بیاوریم و آن را با مدیریت استثنا اجرا کنیم.
public class DivisionExample {

    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int result = divide(a, b);
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: division by zero");
        }
    }

    public static int divide(int a, int b) {
        return a / b;
    }
}
در این مثال، ما یک ساختار try-catch برای رسیدگی به استثنای تقسیم بر صفر اضافه کرده‌ایم. به طور خلاصه، try-catch-finally یک ساختار زبان برنامه نویسی جاوا است که به شما امکان می دهد استثناها را مدیریت کرده و کد را بدون توجه به اینکه آیا استثنا رخ داده است یا خیر، اجرا کنید. try-catch-در نهایت از سه بلوک تشکیل شده است:
  • بلوک سعی کنید . کد بالقوه خطرناک در اینجا اجرا می شود. این کدی است که می تواند یک استثنا ایجاد کند. اگر یک استثنا در یک بلوک try رخ دهد ، اجرای کد در آن بلوک لغو می شود و کنترل به بلوک catch منتقل می شود.
  • بلوک گرفتن . در اینجا استثنای پرتاب شده رسیدگی می شود. در بلوک catch ، می‌توانید مشخص کنید که کدام استثنا باید catch شود و چه منطقی در هنگام گرفتن آن اجرا شود.
  • بلوک نهایی _ این یکی بدون در نظر گرفتن اینکه آیا استثنا رخ داده است یا نه اجرا می شود. بلوک نهایی ، به عنوان مثال، برای انتشار منابع (مانند بستن یک فایل یا سوکت) که در یک بلوک try اختصاص داده شده است، استفاده می شود. می توانید این بلوک را حذف کنید.
ساختار try -catch-finally امکان کنترل دقیق تری بر اجرای برنامه در صورت بروز شرایط استثنایی را فراهم می کند و به جلوگیری از پایان غیرمنتظره برنامه در صورت بروز خطا کمک می کند. حالا بیایید به مثال خود برگردیم. اگر تقسیم بر صفر در روش تقسیم اتفاق بیفتد، یک ArithmeticException پرتاب می شود که توسط بلوک catch گرفته می شود. در بلوک catch ، ما به سادگی یک پیام خطا را به کنسول چاپ می کنیم. در صورت عدم وجود استثنا، برنامه به اجرای خود ادامه می دهد.

کلمه کلیدی را پرتاب می کند

کلمه کلیدی throws در امضای متد استفاده می شود. اگر چنین است، به این معنی است که یک استثنا در متد وجود دارد. این می تواند استثناها را در پشته فراخوانی منتشر کند و نشان دهد که استثناها در روش فعلی نیازی به رسیدگی ندارند. در جاوا، "throws" همچنین می تواند برای اشاره به استثناهای سفارشی تعریف شده در یک برنامه استفاده شود. به عنوان مثال، یک متد ممکن است تقسیم دو عدد را انجام دهد اما اگر آرگومان دوم صفر باشد، یک IllegalArgumentException ایجاد کند:
public static double divide(double a, double b) throws IllegalArgumentException {
    if (b == 0) {
        throw new IllegalArgumentException("Division by zero is not allowed");
    }
    return a / b;
}
این روش از کلمه کلیدی throws استفاده می کند تا نشان دهد که اگر آرگومان دوم تهی باشد، یک IllegalArgumentException می تواند پرتاب شود. اگر چنین استثنایی در حین اجرای متد رخ دهد، برای پردازش به متد فراخوانی داده می شود. مثال فراخوانی روش:
public static void main(String[] args) {
    double result = 0;
    try {
        result = divide(10, 0);
    } catch (IllegalArgumentException e) {
        System.out.println("Error: " + e.getMessage());
    }
    System.out.println("Result: " + result);
}
در این مثال، متد divide() با آرگومان های 10 و 0 فراخوانی می شود که به دلیل غیرممکن بودن تقسیم بر صفر، یک IllegalArgumentException ایجاد می کند. استثنا توسط یک بلوک try-catch گرفته می شود و یک پیام خطا نمایش داده می شود. از آنجایی که استثنا اجرای متد divide() را خاتمه می دهد، این برنامه مقدار صفر را به همراه خواهد داشت .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION