ماشین مجازی جاوا (از این پس JVM) کدها را پردازش می کند و متدها را یکی پس از دیگری اجرا می کند که با متد شروع می شود
main
. وقتی به متد بعدی رسید می گوید که این متد در بالای پشته است. پس از اینکه یک متد به طور کامل اجرا شد، از پشته حذف شده و با روش بعدی در صف جایگزین می شود. برای نشان دادن اصل، این کد را تایپ کنید:
package errorhandling;
public class errorChecking {
public static void main(String[] args) {
System.out.println("Метод Main успешно запущен");
m1();
System.out.println("Метод Main заканчивает свою работу");
}
static void m1() {
System.out.println("Первый метод передаёт привет!(m1)");
m2();
}
static void m2() {
System.out.println("Второй метод передаёт привет(m2)");
}
}
ما سه روش داریم: روش main
، روش m1
و روش m2
. هنگامی که برنامه شروع می شود، روش در بالای پشته قرار دارد main
. در داخل متد main
، متد نامیده می شود m1
. وقتی فراخوانی می شود، به بالای پشته می پرد. متد m1
به نوبه خود m2
. اکنون روش m2
به بالای پشته میرود و موقتاً حذف میشود m1
. این را برای یک ثانیه تصور کنید - main
در بالا m1
و بالا m2
! پس از انجام کار خود، m2
به پایان می رسد و کنترل به m1
. متد m1
پس از تکمیل، از پشته نیز حذف میشود و کنترل دوباره به متد داده میشود main
. برنامه خود را اجرا کنید و به پنجره خروجی نگاه کنید: روش Main با موفقیت اجرا می شود روش اول می گوید hello!(m1) روش دوم می گوید hello(m2) روش Main خارج می شود اگر مشکلی در متد پیش بیاید m2
، JVM (ماشین مجازی جاوا) )، به یاد دارید، درست است؟) به دنبال کنترل کننده های خطا، به عنوان مثال یک بلوک خواهد بود try … catch
. اگر در روش کنترل کننده خطا خطایی وجود نداشته باشد m1
، استثنا به متد منتقل می شود m1
، به این امید که بتواند آن را مدیریت کند. اگر یک کنترل کننده خطا در اینجا شناسایی نشود، استثنا دوباره از پشته به سمت بالا حرکت می کند، این بار به روش main
. اگر روش main
استثناء را نگیرد، یک پیغام خطای عجیب در پنجره خروجی چاپ می شود. به عنوان مثال، روش خود را m2
به شکل زیر در آورید:
static void m2() {
int x = 10;
int y = 0;
double z = x / y;
System.out.println( z );
System.out.println("Method Two - m2");
}
این روش شامل خطای تقسیم بر صفر است. در اینجا نسخه کامل برنامه است، نسخه خود را بررسی کنید:
package errorhandling;
public class errorChecking {
public static void main(String[] args) {
System.out.println("Метод Main успешно запущен");
m1();
System.out.println("Метод Main заканчивает свою работу");
}
static void m1() {
System.out.println("Первый метод передаёт привет!(m1)");
m2();
}
static void m2() {
int x = 10;
int y = 0;
double z = x / y;
System.out.println( z );
System.out.println("Method Two - m2");
}
}
برنامه را اجرا کنید و ببینید پنجره خروجی چه چیزی به شما می دهد: روش Main با موفقیت اجرا شد روش اول می گوید hello!(m1) استثنا در رشته "main" java.lang.ArithmeticException: / با صفر در errorhandling.errorChecking.m2(<u >errorChecking. java:17</u>) در errorhandling.errorChecking.m1(<u>Solution.java:11</u>) در errorhandling.errorChecking.main(<u>>Solution.java:5</u >) فرآیند با کد خروج 1 به پایان رسید شما به چیزی به نام ردیابی پشته نگاه می کنید. سه خطی که با رنگ آبی زیر آنها خط کشیده شده اند به روش های شما اشاره دارد و می توان آنها را در موارد زیر یافت: Name_пакета.Name_класса.Name_метода
اولین خط از بالا جایی است که خطا رخ داده است - در روش m2
. جاوا تضمین میکرد که به گونهای مدیریت میشود ArithmeticException
که تقسیم با خطای صفر باشد. هیچ کنترل کننده خطا در متدهای m2
و وجود ندارد . بنابراین برنامه آن را با کنترل کننده خطای پیش فرض پردازش کرد. روش خود را به روش زیر تغییر دهید: m1
main
m1
try {
System.out.println("Первый метод передаёт привет!(m1)");
m2( );
}
catch (ArithmeticException err) {
System.out.println(err.getMessage());
}
m2
اکنون روش را در یک بلوک پیچیده ایم try
. تا حدی catch
، ما از نوع استثنایی استفاده می کنیم که در stack trace - ردیابی شده است ArithmeticException
. کد را دوباره اجرا کنید و در پنجره خروجی موارد زیر را مشاهده خواهید کرد: روش Main با موفقیت اجرا شد روش اول می گوید hello!(m1) / توسط صفر روش Main خارج می شود توجه کنید که پیام خطا به صورت: " / by zero " چاپ شده است. . این روش m2
به طور کامل اجرا نشد، اما با بروز خطا متوقف شد. سپس کنترل به عقب منتقل شد m1
. این به این دلیل اتفاق افتاد که catch
خود بلوک خطا را تشخیص داد؛ JVM با کنترل کننده خطای استاندارد تماس نگرفت، اما پیامی را که بین پرانتزهای فرفری بلوک قرار داشت نمایش داد catch
. لطفا توجه داشته باشید که خود برنامه متوقف نشده است. کنترل طبق معمول به سراغ روشی رفت main
که از m1
آن فراخوانی شد. و آخرین خط متد قادر به نمایش " End Main methodmain
" بود . این خیلی خیلی مهم است. اگر به مقدار از نیاز داشتید ، برای کارهای بعدی در جایی در . و اگر مقدار وجود نداشته باشد، ممکن است برنامه شما اصلاً آنطور که انتظار دارید کار نکند. هنگامی که دنباله پشته را در پنجره خروجی می بینید، فقط بدانید که خط اول جایی است که مشکل رخ داده است، و خطوط باقیمانده (البته اگر وجود داشته باشد) جایی است که استثنا در پشته منتشر شده است، که معمولاً با علامت ختم می شود . ترجمه از homeandlearn.co.uk ما از شما تشکر می کنیم: Sergei Sysoev، Treefeed... m1
main
main
GO TO FULL VERSION