Java Virtual Machine (ต่อไปนี้จะเรียกว่า JVM) ประมวลผลโค้ดและรันวิธีการต่างๆ ตามลำดับ โดยเริ่มต้นด้วย
main
method เมื่อถึงวิธีถัดไปก็บอกว่าวิธีนี้อยู่ด้านบนสุดของสแต็ก หลังจากที่ดำเนินการเมธอดอย่างสมบูรณ์แล้ว มันจะถูกลบออกจากสแต็กและแทนที่ด้วยเมธอดถัดไปในคิว เพื่อสาธิตหลักการ ให้พิมพ์รหัสนี้: 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)");
}
}
เรามีสามวิธี: method main
, method m1
และm2
method เมื่อโปรแกรมเริ่มทำงาน วิธีการจะอยู่ที่ด้านบนสุดของสแต็main
ก ภายใน method จะมี ชื่อว่าmain
method m1
เมื่อเรียกก็จะกระโดดขึ้นไปบนกอง วิธีการm1
ในทางกลับกันจะเรียกm2
. ตอนนี้เมธอดm2
จะข้ามไปที่ด้านบนของสแต็ก โดยจะลบm1
. ลองนึกภาพสิ่งนี้สักครู่ - main
บนm1
และบนm2
! เมื่อทำธุรกิจเสร็จm2
ก็ยุติและการควบคุมกลับคืนm1
สู่ เมื่อเสร็จแล้ว เมธอดm1
จะถูกลบออกจากสแต็กด้วย และการควบคุมจะถูกกำหนดให้กับเมธอดอีกmain
ครั้ง รันโปรแกรมของคุณและดูที่หน้าต่างเอาท์พุต: วิธี Main ทำงานได้สำเร็จ วิธีแรกพูดว่า hello!(m1) วิธีที่สองพูดว่า hello(m2) วิธีการ Main จะออก หากมีสิ่งผิดปกติเกิดขึ้นในวิธีนั้นm2
JVM (Java Virtual Machine ) คุณจำได้ใช่ไหม?) จะมองหาตัวจัดการข้อ try … catch
ผิดพลาด เช่น block หากไม่มีข้อผิดพลาดใน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");
}
}
รันโปรแกรมและดูว่าหน้าต่างเอาท์พุตให้อะไรกับคุณ: วิธีการหลักทำงานได้สำเร็จ วิธีแรกบอกว่าสวัสดี!(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
การ Java รับประกันว่าได้รับการจัดการในลักษณะArithmeticException
ที่ตรวจพบข้อผิดพลาดในการหารโดยไม่มีข้อผิดพลาด ไม่มีตัวจัดการข้อผิดพลาดในเมธอดm2
และ ดังนั้นโปรแกรมจึงประมวลผลด้วยตัวจัดการข้อผิดพลาดเริ่มต้น เปลี่ยนวิธีการของคุณดังต่อไปนี้: m1
main
m1
try {
System.out.println("Первый метод передаёт привет!(m1)");
m2( );
}
catch (ArithmeticException err) {
System.out.println(err.getMessage());
}
ตอนนี้เราได้รวมวิธีการไว้m2
ในบล็อกtry
แล้ว ในส่วนหนึ่งcatch
เราใช้ประเภทของข้อยกเว้นที่ตรวจพบในการติดตามสแต็กArithmeticException
- เรียกใช้โค้ดอีกครั้งแล้วคุณจะเห็นสิ่งต่อไปนี้ในหน้าต่างเอาท์พุต: วิธีหลักทำงานได้สำเร็จ วิธีแรกบอกว่าสวัสดี! (m1) / โดยศูนย์ วิธีการหลักออก โปรด สังเกตว่าข้อความแสดงข้อผิดพลาดถูกพิมพ์เป็น: " / โดยศูนย์ " . วิธีการนี้m2
ไม่ได้ดำเนินการอย่างสมบูรณ์ แต่ถูกหยุดลงเมื่อมีข้อผิดพลาดเกิดขึ้น จากนั้นการควบคุมก็ถูกโอนm1
กลับ สิ่งนี้เกิดขึ้นเนื่องจากความจริงที่ว่าบล็อกcatch
นั้นรับรู้ถึงข้อผิดพลาด JVM ไม่ได้ติดต่อกับตัวจัดการข้อผิดพลาดมาตรฐาน แต่แสดงข้อความที่อยู่ระหว่างเครื่องหมายปีกกาของcatch
บล็อก โปรดทราบว่าตัวโปรแกรมไม่ได้หยุดทำงาน การควบคุมเป็นไปตามวิธีการmain
ที่m1
เรียกว่า ตามปกติ และบรรทัดสุดท้ายของ method main
ก็สามารถแสดง " End Main method " ได้ นี่เป็นสิ่งสำคัญมาก หากคุณต้องการค่า from m1
สำหรับงานต่อไปในmain
. และหากไม่มีค่าดังกล่าว โปรแกรมของคุณอาจไม่ทำงานอย่างที่คุณคาดหวัง เมื่อคุณเห็นการติดตามสแต็กในหน้าต่างเอาท์พุต โปรดทราบว่าบรรทัดแรกคือจุดที่เกิดปัญหา และบรรทัดที่เหลือ (ถ้ามี) เป็นที่ที่มีการแพร่กระจายข้อยกเว้นขึ้นไปบนสแต็ก ซึ่งโดยปกติจะลงท้ายด้วยmain
. คำแปลจากhomeandlearn.co.uk เราขอขอบคุณ: Sergei Sysoev, Treefeed...
GO TO FULL VERSION