ในภาษาจาวา ข้อยกเว้นจะถูกแบ่งออกเป็นสองประเภท:
ข้อยกเว้นที่ตรวจสอบ: ข้อยกเว้นประเภทนี้จะต้องถูกส่งอย่างชัดเจนในส่วนคำสั่งการพ่นหรือตรวจพบภายในวิธีการ ตัวอย่างเช่น IOException หรือ ClassNotFoundException
ข้อยกเว้นที่ไม่ได้ตรวจสอบ: ข้อยกเว้นประเภทนี้ไม่จำเป็นต้องถูกโยนทิ้งหรือตรวจพบอย่างชัดเจน ตัวอย่างเช่น NumberFormatException
เมื่อข้อยกเว้นที่เลือกถูกโยนทิ้งในเมธอด run() ของอ็อบเจ็กต์ Thread เราต้องจับและจัดการมัน เนื่องจากเมธอด run() ไม่สามารถส่งข้อยกเว้นได้ เมื่อมีการส่งข้อยกเว้นที่ไม่ถูกตรวจสอบในเมธอด run() ของอ็อบเจ็กต์ Thread ลักษณะการทำงานเริ่มต้นคือการพิมพ์ข้อมูลการติดตามสแต็กบนคอนโซล จากนั้นออกจากโปรแกรม
โชคดีที่ Java มีกลไกที่ออกแบบมาโดยเฉพาะเพื่อจัดการกับข้อยกเว้นที่ไม่ได้ตรวจสอบซึ่งเกิดจากอ็อบเจ็กต์ Thread เพื่อหลีกเลี่ยงการออกจากโปรแกรม
ในส่วนนี้ เราใช้ตัวอย่างเพื่อสาธิตกลไกนี้
รู้ว่ามัน
ทำตามขั้นตอนที่แสดงด้านล่างเพื่อนำตัวอย่างของเราไปใช้
1. ขั้นแรก เราจำเป็นต้องปรับใช้คลาสเพื่อจัดการกับข้อยกเว้นที่ไม่ถูกตรวจสอบ คลาสนี้ต้องใช้คลาส UncaughtExceptionHandler และใช้เมธอด uncaughtException() ที่ประกาศไว้ในอินเทอร์เฟซนี้ ในตัวอย่างนี้ ชื่อคลาสคือ ExceptionHandler และเมธอด uncaughtException() จะพิมพ์ข้อยกเว้นและข้อมูลเธรดที่ทำให้เกิดข้อยกเว้น รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ExceptionHandler ระดับสาธารณะใช้ Thread.UncaughtExceptionHandler {
@แทนที่
โมฆะสาธารณะ uncaughtException (เธรด t, Throwable e) {
System.out.printf("ข้อยกเว้นถูกจับแล้ว//n");
System.out.printf("Thread: %s/n", t.getId());
System.out.printf("ข้อยกเว้น: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("การติดตามสแต็ก: /n");
e.printStackTrace (System.out);
System.out.printf("สถานะเธรด: %s/n", t.getState());
-
-
2. ปรับใช้คลาสที่สามารถโยนข้อยกเว้นที่ไม่ได้ตรวจสอบ ซึ่งเรียกว่า Task ใช้งานอินเทอร์เฟซ Runnable ใช้งานเมธอด run() และเขียนโค้ดพิเศษให้กับส่วนของโค้ดที่สามารถสร้างข้อยกเว้นที่ไม่ได้ตรวจสอบ เช่น แปลงสตริงเป็นตัวเลข รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
งานคลาสสาธารณะใช้งาน Runnable {
@แทนที่
โมฆะสาธารณะวิ่ง () {
int numero = Integer.parseInt("diguage.com");
-
-
3. สร้างคลาสหลักของโปรแกรม ซึ่งเป็นคลาส Main จากนั้นจึงนำเมธอด main() ไปใช้ รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ชั้นเรียนสาธารณะหลัก {
โมฆะคงที่สาธารณะ main (String [] args) {
4. สร้างวัตถุงานและสร้างวัตถุเธรดเพื่อดำเนินการ ใช้เมธอด setUncaughtExceptionHandler() เพื่อตั้งค่าคลาสการจัดการสำหรับข้อยกเว้นที่ไม่ได้ตรวจสอบ จากนั้นให้เริ่มเธรด รหัสมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
งาน งาน = งานใหม่ ();
เธรดเธรด = เธรดใหม่ (งาน);
thread.setUncaughtExceptionHandler(ตัวจัดการข้อยกเว้นใหม่());
เธรด.เริ่มต้น();
5. รันตัวอย่างและดูผลลัพธ์
รู้ว่าทำไม
ผลลัพธ์ของการดำเนินการที่ผิดปกติสามารถดูได้จากตัวอย่างข้อมูลเอาต์พุตด้านล่าง ข้อยกเว้นจะถูกส่งออกไป จากนั้นจะถูกจับโดยคลาสตัวจัดการ และข้อมูลข้อยกเว้นจะถูกพิมพ์ไปยังคอนโซล
คัดลอกรหัสรหัสดังต่อไปนี้:
มีการบันทึกข้อยกเว้นแล้ว
หัวข้อ: 9
ข้อยกเว้น: java.lang.NumberFormatException: สำหรับสตริงอินพุต: "diguage.com"
ติดตามสแต็ก:
java.lang.NumberFormatException: สำหรับสตริงอินพุต: "diguage.com"
ที่ java.lang.NumberFormatException.forInputString (NumberFormatException.java:65)
ที่ java.lang.Integer.parseInt (Integer.java:492)
ที่ java.lang.Integer.parseInt (Integer.java:527)
ที่ com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
ที่ java.lang.Thread.run(Thread.java:722)
สถานะเธรด: RUNNABLE
กระบวนการเสร็จสิ้นด้วยรหัสทางออก 0
เมื่อเธรดส่งข้อยกเว้นและข้อยกเว้น (ในที่นี้อ้างถึงข้อยกเว้นที่ไม่ได้ตรวจสอบโดยเฉพาะ) จะไม่ถูกตรวจจับ เครื่องเสมือน Java จะตรวจสอบว่าคลาสการจัดการข้อยกเว้นที่ไม่ได้ตรวจสอบถูกตั้งค่าผ่านวิธีการที่เกี่ยวข้องหรือไม่ หากมีการตั้งค่าไว้ ให้ใช้วิธี uncaughtException( ) และส่งเธรดและข้อยกเว้นเป็นพารามิเตอร์ไปยังเมธอด
หากไม่มีการตั้งค่าคลาสการประมวลผล เครื่องเสมือน Java จะพิมพ์ข้อมูลการติดตามสแต็กบนคอนโซล จากนั้นออกจากโปรแกรม
ไม่มีวันสิ้นสุด
คลาส Thread ยังมีวิธีการที่เกี่ยวข้องกับการจัดการข้อยกเว้นที่ไม่ได้ตรวจสอบ นี่คือเมธอดคงที่ setDefaultUncaughtExceptionHandler() ซึ่งสามารถตั้งค่าคลาสการจัดการข้อยกเว้นที่ไม่ได้ตรวจสอบสำหรับเธรดทั้งหมดในโปรแกรม
เมื่อมีการส่งข้อยกเว้นที่ไม่ถูกตรวจจับในเธรด เครื่องเสมือน Java จะค้นหาคลาสการจัดการข้อยกเว้นจากสามแห่ง:
ขั้นแรก ให้มองหาคลาสการจัดการข้อยกเว้นจากวัตถุเธรด และนั่นคือสิ่งที่เราได้เรียนรู้ในส่วนนี้ หากไม่มีอยู่ คลาสการจัดการข้อยกเว้นจะถูกค้นหาจากกลุ่มเธรด (ThreadGroup) ซึ่งมีเธรดอยู่ ส่วนนี้จะอธิบายโดยเฉพาะในภายหลัง หากยังไม่มี ให้ค้นหาคลาสการจัดการข้อยกเว้นเริ่มต้นของโปรแกรมที่กล่าวถึงข้างต้น
หากไม่มีตัวจัดการข้อยกเว้นที่กล่าวถึงข้างต้น เครื่องเสมือน Java จะพิมพ์ข้อมูลการติดตามสแต็กของข้อยกเว้นไปยังคอนโซล จากนั้นออกจากโปรแกรม
ใช้หลักคำสอน
บทความนี้แปลมาจาก "Java 7 Concurrency Cookbook" (D Gua Ge ขโมยมาในชื่อ "Java7 Concurrency Example Collection") และใช้เป็นสื่อการเรียนรู้เท่านั้น ห้ามนำไปใช้เพื่อวัตถุประสงค์ทางการค้าใดๆ โดยไม่ได้รับอนุญาต
ความสำเร็จเล็กๆ น้อยๆ
รหัสที่สมบูรณ์ของคลาส ExceptionHandler เป็นดังนี้:
แพ็คเกจ com.diguage.books.concurrencycookbook.chapter1.recipe8;
-
* คลาสการจัดการข้อยกเว้นที่ไม่ได้ตรวจสอบ
* วันที่: 22-09-2013
* เวลา: 23:11 น
-
ExceptionHandler ระดับสาธารณะใช้ Thread.UncaughtExceptionHandler {
@แทนที่
โมฆะสาธารณะ uncaughtException (เธรด t, Throwable e) {
System.out.printf("ข้อยกเว้นถูกจับ/n");
System.out.printf("Thread: %s/n", t.getId());
System.out.printf("ข้อยกเว้น: %s: %s/n", e.getClass().getName(),
e.getMessage());
System.out.printf("การติดตามสแต็ก: /n");
e.printStackTrace (System.out);
System.out.printf("สถานะเธรด: %s/n", t.getState());
-
-
รหัสที่สมบูรณ์ของคลาสงาน
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.diguage.books.concurrencycookbook.chapter1.recipe8;
-
* คลาสการสร้างข้อยกเว้น
* วันที่: 22-09-2013
* เวลา: 23:18 น
-
งานคลาสสาธารณะใช้งาน Runnable {
@แทนที่
โมฆะสาธารณะวิ่ง () {
int numero = Integer.parseInt("diguage.com");
-
-
รหัสที่สมบูรณ์ของคลาสหลัก
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.diguage.books.concurrencycookbook.chapter1.recipe8;
-
* ตัวอย่างคลาสหลัก
* วันที่: 22-09-2013
* เวลา: 23:20 น
-
ชั้นเรียนสาธารณะหลัก {
โมฆะคงที่สาธารณะ main (String [] args) {
งาน งาน = งานใหม่ ();
เธรดเธรด = เธรดใหม่ (งาน);
thread.setUncaughtExceptionHandler(ตัวจัดการข้อยกเว้นใหม่());
เธรด.เริ่มต้น();
-
-