ข้อผิดพลาดอาจเกิดขึ้นได้ระหว่างการทำงานของโปรแกรม มันเป็นปัญหาทั่วไปสำหรับโปรแกรมเมอร์ทุกคน ตั้งแต่ผู้เริ่มต้นจนถึงมือโปรตัวจริง ไม่ใช่ข้อผิดพลาดทั้งหมดที่เกิดขึ้นจากความผิดของผู้พัฒนา บางอย่างก็คาดเดาได้ยากและบางครั้งก็เป็นไปไม่ได้ ตัวอย่างเช่น ขณะดาวน์โหลดโปรแกรม การเชื่อมต่อเครือข่ายอาจขาดหายกะทันหันหรือไฟฟ้าดับ สถานการณ์ดังกล่าวเรียกว่าข้อยกเว้น Try and catch เป็นส่วนหนึ่งของโครงสร้างที่ใช้สำหรับจัดการกับข้อยกเว้น
Java ลองและจับบล็อก
เมื่อมีข้อผิดพลาดเกิดขึ้น Java มักจะหยุดและสร้างข้อความแสดงข้อผิดพลาด กระบวนการนี้เรียกว่า "Java ส่งข้อยกเว้น" Java มีสิ่งอำนวยความสะดวกพิเศษสำหรับการจัดการข้อยกเว้น หนึ่งในนั้นคือพยายาม...จับ...ในที่สุดก็ก่อสร้าง นี่คือไวยากรณ์ของ try block, catch block และสุดท้ายคือ block//try block
try {
// Block of code to try
}
//try catch
catch(Exception e) {
// Block of code to handle errors
}
finally {
// Optional block of code
}
เมื่อมีข้อยกเว้นเกิดขึ้นในบล็อก try การควบคุมจะส่งผ่านไปยังบล็อก catch ซึ่งสามารถจัดการข้อยกเว้นได้ หากไม่พบบล็อกดังกล่าว ข้อความแสดงข้อยกเว้นที่ไม่สามารถจัดการได้จะปรากฏขึ้นให้ผู้ใช้เห็น และการทำงานของโปรแกรมต่อไปจะหยุดลง เป็นการป้องกันการหยุดฉุกเฉินที่คุณต้องใช้บล็อก try..catch ![ลอง Java - จับ - 1](https://cdn.codegym.cc/images/article/ab0bf0e8-2813-4ec0-827d-164b2284a9a8/800.jpeg)
สั้นๆ เกี่ยวกับ try, catch, ในที่สุด, ก็พ่นคำสำคัญ
การจัดการข้อยกเว้นใน Java ขึ้นอยู่กับการใช้คีย์เวิร์ดต่อไปนี้ในโปรแกรม:- ลอง - กำหนดบล็อกของโค้ดที่อาจเกิดข้อยกเว้นได้
- catch - กำหนดบล็อกของโค้ดที่ใช้จัดการข้อยกเว้น
- ในที่สุด — กำหนดบล็อกของโค้ดที่เป็นทางเลือก แต่ถ้ามีอยู่ ก็จะดำเนินการต่อไป โดยไม่คำนึงถึงผลลัพธ์ของบล็อกลอง
- โยน - ใช้เพื่อยกข้อยกเว้น;
- พ่น — ใช้ในลายเซ็นวิธีการเพื่อเตือนว่าวิธีการอาจส่งข้อยกเว้น
ตัวอย่างง่ายๆ ของโครงสร้าง try-catch
สมมติว่าเรามีโปรแกรมที่มีอาเรย์อยู่บ้างpublic class TryTest {
public static void main(String[] args) {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
}
}
เนื่องจากเรากำลังพยายามเข้าถึงองค์ประกอบอาร์เรย์ที่มีดัชนีที่ไม่มีอยู่จริง โปรแกรมจะออกโดยมีข้อผิดพลาด:
ข้อยกเว้นในเธรด "main" java.lang.ArrayIndexOutOfBoundsException: ดัชนี 7 อยู่นอกขอบเขตสำหรับความยาว 5 ที่วัน TryTest.main (TryTest.java: 6) กระบวนการเสร็จสิ้นด้วยรหัสออก 1
มาแก้ไขโปรแกรมนี้และจัดการกับข้อยกเว้นนี้ด้วย try-catch มาก่อนลองบล็อก ต่อมา - catch block
//try catch example
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
System.out.println("The exception was handled...");
}
System.out.println("This is the end of the program...");
}
}
ตอนนี้ผลลัพธ์มีการเปลี่ยนแปลง:
จัดการข้อยกเว้นแล้ว... นี่คือจุดสิ้นสุดของโปรแกรม... กระบวนการเสร็จสิ้นด้วยรหัสทางออก 0 กระบวนการเสร็จสิ้นด้วยรหัสทางออก 0
ในกรณีนี้โปรแกรมสมบูรณ์ถูกต้อง ข้อความของเราก็แสดงบนหน้าจอ การสิ้นสุดโปรแกรมที่ถูกต้องจะส่งสัญญาณด้วยรหัส 0 เมื่อสิ้นสุดกระบวนการ ในขณะที่ไม่ถูกต้อง — 1 เมื่อใช้บล็อก try...catch คำสั่งทั้งหมดระหว่างคำสั่ง try และ catch จะถูกดำเนินการก่อน หากมีข้อยกเว้นเกิดขึ้นในบล็อก try ลำดับการดำเนินการปกติจะหยุดและดำเนินการต่อไปยังคำสั่ง catch ดังนั้นเมื่อโปรแกรมรันถึงตัวเลข[7]=8; บรรทัด โปรแกรมจะหยุดและไปที่ catch block ในกรณีของเรา เราได้ประกาศตัวแปร myEx ด้วยประเภท Exception นี่คือคลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมด ดังนั้นจึงสามารถแตกต่างได้ ตัวอย่างเช่น มีข้อยกเว้นที่รับผิดชอบต่อสแต็กโอเวอร์โฟลว์ ซึ่งไปไกลกว่าการจัดทำดัชนีอาเรย์ ดังเช่นในกรณีของเรา การชี้ไปที่ Null และอื่นๆ หากเราไม่เดาประเภทของข้อยกเว้น โปรแกรมก็จะยุติอย่างไม่ถูกต้องเช่นกัน อย่างไรก็ตาม เราเลือกประเภทข้อยกเว้นเพื่อความง่ายของตัวอย่าง และเป็นคลาสพื้นฐานสำหรับข้อยกเว้นทั้งหมด ดังนั้นคำสั่ง catch (Exception myEx) จะจัดการกับข้อยกเว้นเกือบทั้งหมด การจัดการกับข้อยกเว้นในกรณีนี้ หลังจากที่ catch block เสร็จสิ้น โปรแกรมยังคงทำงานต่อไป โดยดำเนินการคำสั่งอื่นๆ ทั้งหมดหลังจาก catch block หากคุณต้องการดูข้อยกเว้นที่เกิดขึ้น คุณสามารถให้โปรแกรมพิมพ์การติดตามสแต็กของการเรียกเมธอดได้ นี่คือสิ่งที่ JVM ทำเมื่อเกิดข้อยกเว้นที่ไม่ถูกตรวจจับ: มันหยุดการทำงานของโปรแกรม และพิมพ์การติดตามสแต็กหลังจากรันโค้ดของบล็อกสุดท้าย (ถ้ามี)
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
myEx.printStackTrace();
}
System.out.println("This is the end of the program...");
}
}
การจัดการข้อยกเว้นในกรณีนี้ต้องอาศัยการพิมพ์สแต็กการติดตามข้อผิดพลาดไปยังคอนโซลโดยใช้ เมธอด printStackTrace()ที่กำหนดไว้ในคลาส Exception
java.lang.ArrayIndexOutOfBoundsException: ดัชนี 7 อยู่นอกขอบเขตสำหรับความยาว 5 ที่วันTryTest.main(TryTest.java:7) นี่คือจุดสิ้นสุดของโปรแกรม... กระบวนการเสร็จสิ้นด้วยรหัสออก 0
อย่างไรก็ตาม โปรแกรมออกอย่างถูกต้อง
ในที่สุด! หลังจากจับ
ในตัวอย่างและในคำจำกัดความของคำสำคัญสำหรับการจัดการข้อยกเว้น เราได้กล่าวถึงบล็อกสุดท้ายแล้ว เป็นทางเลือก แต่หากมีอยู่ ก็จะถูกดำเนินการโดยไม่คำนึงถึงผลลัพธ์ของบล็อก try มาเปลี่ยนประเภทข้อยกเว้นเป็น NullPointerExceptionpublic class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (NullPointerException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
นี่คือผลลัพธ์:
ข้อยกเว้นในเธรด "main" java.lang.ArrayIndexOutOfBoundsException: ดัชนี 7 อยู่นอกขอบเขตสำหรับความยาว 5 ที่วัน TryTest.main (TryTest.java: 7) ในที่สุดกระบวนการก็เสร็จสิ้นด้วยรหัสทางออก 1
อย่างไรก็ตามเราสามารถระบุประเภทของข้อยกเว้นให้ถูกต้องได้ นี่คือ IndexOutOfBoundsException
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (IndexOutOfBoundsException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
ในกรณีนี้ผลลัพธ์จะเป็นดังนี้:
ข้อยกเว้นได้รับการจัดการ... ในที่สุด นี่คือจุดสิ้นสุดของโปรแกรม... กระบวนการเสร็จสิ้นด้วยรหัสออก 0
ข้อยกเว้นทำงานอย่างไร
ประเด็นก็คือคำเหล่านี้ทั้งหมด —catch, Throw, Throws สามารถใช้ได้กับ java.lang.Throwable หรือลูกหลานเท่านั้น ตัวอย่างเช่น คุณสามารถทำได้:public class MyClass {
public static void main(String[] args) {
try {
} catch (Throwable thr) {
}
}
}
อย่างไรก็ตาม คุณไม่สามารถทำเช่นนี้ได้:
public class MyClass {
public static void main(String[] args) {
try {
} catch (String thr) {
}
}
}