การจัดการข้อยกเว้นใน Java
ข้อยกเว้นในคืออะไร Java?
ข้อยกเว้นใน Java เป็นเหตุการณ์ที่ขัดขวางการดำเนินการคำสั่งของโปรแกรม และรบกวนขั้นตอนปกติของการเรียกใช้โปรแกรม เป็นอ็อบเจ็กต์ที่ล้อมรอบข้อมูลเหตุการณ์ข้อผิดพลาดที่เกิดขึ้นภายในวิธีการและถูกส่งไปยังระบบรันไทม์ ใน Javaข้อยกเว้นส่วนใหญ่จะใช้เพื่อระบุเงื่อนไขข้อผิดพลาดประเภทต่างๆ
ข้อผิดพลาดมีสองประเภท:
- ข้อผิดพลาดในการคอมไพล์เวลา
- ข้อผิดพลาดรันไทม์
ข้อผิดพลาดในการคอมไพล์เวลาสามารถจำแนกได้อีกครั้งเป็นสองประเภท:
- ข้อผิดพลาดทางไวยากรณ์
- ข้อผิดพลาดทางความหมาย
ตัวอย่างข้อผิดพลาดทางไวยากรณ์:
แทนที่จะประกาศ. int a;
คุณประกาศผิดว่าเป็น in a;
คอมไพเลอร์ตัวไหนที่จะส่งข้อผิดพลาด
ตัวอย่าง: คุณได้ประกาศตัวแปร int a;
และหลังจากโค้ดบางบรรทัด คุณจะประกาศจำนวนเต็มอีกครั้งเป็น int a;
ข้อผิดพลาดทั้งหมดเหล่านี้จะถูกเน้นไว้เมื่อคุณคอมไพล์โค้ด
ตัวอย่างข้อผิดพลาดรันไทม์
ข้อผิดพลาดรันไทม์เรียกว่า ข้อยกเว้น ข้อผิดพลาด คือเหตุการณ์ใดๆ ก็ตามที่ขัดจังหวะการทำงานปกติของโปรแกรม ตัวอย่างของข้อยกเว้น ได้แก่ ข้อยกเว้นเลขคณิต ข้อยกเว้น Nullpointer ข้อยกเว้นการหารด้วยศูนย์ เป็นต้น ข้อยกเว้นใน Java เป็นสิ่งที่อยู่นอกเหนือการควบคุมของนักพัฒนา
คลิก Good Farm Animal Welfare Awards หากไม่สามารถเข้าถึงวิดีโอได้
ทำไมเราถึงต้องการข้อยกเว้น?
สมมติว่าคุณได้เขียนโค้ดโปรแกรมเพื่อเข้าถึงเซิร์ฟเวอร์ สิ่งต่าง ๆ ทำงานได้ดีในขณะที่คุณกำลังพัฒนาโค้ด
ในระหว่างการดำเนินการผลิตจริง เซิร์ฟเวอร์หยุดทำงาน เมื่อโปรแกรมของคุณพยายามเข้าถึง จะมีข้อยกเว้นเกิดขึ้น
วิธีจัดการกับข้อยกเว้น
จนถึงตอนนี้เราได้เห็นแล้วว่าข้อยกเว้นอยู่นอกเหนือการควบคุมของนักพัฒนา แต่การกล่าวโทษความล้มเหลวของโค้ดเกี่ยวกับปัญหาด้านสิ่งแวดล้อมไม่ใช่วิธีแก้ปัญหา คุณต้องมีการเขียนโปรแกรมที่แข็งแกร่งซึ่งจะดูแลสถานการณ์พิเศษ รหัสดังกล่าวเรียกว่า ตัวจัดการข้อยกเว้น
ในตัวอย่างของเรา การจัดการข้อยกเว้นที่ดีคือ เมื่อเซิร์ฟเวอร์ล่ม ให้เชื่อมต่อกับเซิร์ฟเวอร์สำรอง
ในการใช้งาน ให้ป้อนโค้ดของคุณเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ (โดยใช้เงื่อนไข if และ else แบบดั้งเดิม) คุณจะตรวจสอบว่าเซิร์ฟเวอร์หยุดทำงานหรือไม่ หากหยุดทำงาน ให้เขียนโค้ดเพื่อเชื่อมต่อกับเซิร์ฟเวอร์สำรอง การจัดระเบียบโค้ดดังกล่าวโดยใช้ลูป "if" และ "else" จะไม่มีผลเมื่อโค้ดของคุณมีหลายเงื่อนไข ข้อยกเว้นของจาวา เพื่อจัดการ
class connect{ if(Server Up){ // code to connect to server } else{ // code to connect to BACKUP server } }
ลองจับบล็อก
Java ให้การควบคุมที่ยอดเยี่ยมในตัว
- รหัสปกติจะเข้าสู่ a TRY กลุ่ม
- รหัสการจัดการข้อยกเว้นจะอยู่ในไฟล์ จับ ปิดกั้น
ในตัวอย่างของเรา บล็อก TRY จะประกอบด้วยโค้ดสำหรับเชื่อมต่อกับเซิร์ฟเวอร์ บล็อก CATCH จะประกอบด้วยโค้ดสำหรับเชื่อมต่อกับเซิร์ฟเวอร์สำรอง หากเซิร์ฟเวอร์ทำงานอยู่ โค้ดในบล็อก CATCH จะถูกละเว้น หากเซิร์ฟเวอร์หยุดทำงาน ข้อยกเว้นจะเกิดขึ้น และโค้ดในบล็อก Catch จะถูกดำเนินการ
ดังนั้นนี่คือวิธีการจัดการข้อยกเว้น Java.
ไวยากรณ์การใช้ try & catch
try{ statement(s) } catch (exceptiontype name){ statement(s) }
ตัวอย่าง
ขั้นตอน 1) คัดลอกโค้ดต่อไปนี้ลงในโปรแกรมแก้ไข
class JavaException { public static void main(String args[]){ int d = 0; int n = 20; int fraction = n/d; System.out.println("End Of Main"); } }
ขั้นตอน 2) บันทึกไฟล์และคอมไพล์โค้ด เรียกใช้โปรแกรมโดยใช้คำสั่ง java Javaข้อยกเว้น
ขั้นตอน 3) ข้อยกเว้นทางคณิตศาสตร์ - หารด้วยศูนย์จะแสดงไว้ด้านล่างสำหรับบรรทัด # 5 และบรรทัด # 6 จะไม่ถูกดำเนินการ
ขั้นตอน 4) ตอนนี้เรามาดูกันว่าการ try and catch จะช่วยให้เราจัดการกับข้อยกเว้นนี้ได้อย่างไร เราจะใส่ข้อยกเว้นที่ทำให้เกิดบรรทัดของโค้ดลงใน ลอง บล็อกตามด้วย จับ บล็อก คัดลอกโค้ดต่อไปนี้ลงในตัวแก้ไข
class JavaException { public static void main(String args[]) { int d = 0; int n = 20; try { int fraction = n / d; System.out.println("This line will not be Executed"); } catch (ArithmeticException e) { System.out.println("In the catch Block due to Exception = " + e); } System.out.println("End Of Main"); } }
ขั้นตอน 5) บันทึก คอมไพล์ และรันโค้ด คุณจะได้ผลลัพธ์ดังต่อไปนี้
ในขณะที่คุณสังเกต ข้อยกเว้นจะถูกจัดการ และโค้ดบรรทัดสุดท้ายก็ถูกดำเนินการเช่นกัน นอกจากนี้ โปรดทราบว่าบรรทัด #7 จะไม่ถูกดำเนินการเนื่องจาก ทันทีที่มีข้อยกเว้นเกิดขึ้น การไหลของการควบคุมจะข้ามไปยังบล็อก catch
หมายเหตุ AritmeticException Object “e” มีข้อมูลเกี่ยวกับข้อยกเว้นที่เกิดขึ้นซึ่งอาจเป็นประโยชน์ในการดำเนินการกู้คืน
Java ลำดับชั้นข้อยกเว้น
หลังจากดำเนินการคำสั่ง catch หนึ่งคำสั่งแล้ว คำสั่งอื่น ๆ จะถูกข้าม และการดำเนินการจะดำเนินต่อไปหลังจากบล็อก try/catch บล็อก catch ที่ซ้อนกันเป็นไปตามลำดับชั้นของข้อยกเว้น
- คลาสข้อยกเว้นทั้งหมดใน Java ขยายคลาส 'Throwable' Throwable มีสองคลาสย่อยคือ Error และ Exception
- คลาส Error กำหนดข้อยกเว้นหรือปัญหาที่โปรแกรมของเราไม่คาดว่าจะเกิดขึ้นภายใต้สถานการณ์ปกติ เช่น ข้อผิดพลาดของหน่วยความจำ ข้อผิดพลาดของฮาร์ดแวร์ ข้อผิดพลาด JVM เป็นต้น
- คลาส Exception แสดงถึงข้อยกเว้นที่โปรแกรมของเราสามารถจัดการได้ และโปรแกรมของเราสามารถกู้คืนได้จากข้อยกเว้นนี้โดยใช้ try and catch block
- ข้อยกเว้นรันไทม์เป็นคลาสย่อยของคลาสข้อยกเว้น ข้อยกเว้นประเภทนี้แสดงถึงข้อยกเว้นที่เกิดขึ้นในขณะรันไทม์และไม่สามารถติดตามได้ในขณะคอมไพล์ ตัวอย่างที่ดีเยี่ยมของข้อยกเว้นแบบเดียวกันคือข้อยกเว้นการหารด้วยศูนย์ หรือข้อยกเว้นตัวชี้ค่าว่าง เป็นต้น
- ข้อยกเว้น IO ถูกสร้างขึ้นระหว่างการดำเนินการอินพุตและเอาต์พุต
- ข้อยกเว้นที่ถูกขัดจังหวะใน Javaถูกสร้างขึ้นระหว่างการเธรดหลาย ๆ ครั้ง
ตัวอย่าง: เพื่อทำความเข้าใจการซ้อนกันของบล็อก try and catch
ขั้นตอน 1) คัดลอกโค้ดต่อไปนี้ลงในโปรแกรมแก้ไข
class JavaException { public static void main(String args[]) { try { int d = 1; int n = 20; int fraction = n / d; int g[] = { 1 }; g[20] = 100; } /*catch(Exception e){ System.out.println("In the catch block due to Exception = "+e); }*/ catch (ArithmeticException e) { System.out.println("In the catch block due to Exception = " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("In the catch block due to Exception = " + e); } System.out.println("End Of Main"); } }
ขั้นตอน 2) บันทึกไฟล์และคอมไพล์โค้ด รันโปรแกรมโดยใช้คำสั่ง ชวา Javaข้อยกเว้น.
ขั้นตอน 3) ArrayIndexOutOfBoundsException ถูกสร้างขึ้น เปลี่ยนค่าของ int d เป็น 0 บันทึก คอมไพล์ และรันโค้ด
ขั้นตอนที่ 4) ต้องสร้าง ArithmeticException
ขั้นตอน 5) ไม่ใส่เครื่องหมายข้อคิดเห็นบรรทัด #10 ถึงบรรทัด #12 บันทึก คอมไพล์ และรันโค้ด
ขั้นตอน 6) ข้อผิดพลาดในการรวบรวม? เนื่องจากข้อยกเว้นเป็นคลาสพื้นฐานของ ArithmeticException Exception ข้อยกเว้นใด ๆ ที่เกิดขึ้นโดย ArithmeticException สามารถจัดการได้โดยคลาส Exception เช่นกัน ดังนั้น catch block ของ ArithmeticException จะไม่มีโอกาสถูกดำเนินการซึ่งทำให้ซ้ำซ้อน จึงเกิดข้อผิดพลาดในการคอมไพล์
Java ในที่สุดก็บล็อค
บล็อกสุดท้ายก็คือ ดำเนินการโดยไม่คำนึงถึงข้อยกเว้นที่เกิดขึ้น ในบล็อกลอง มันคือ ไม่จำเป็น เพื่อใช้กับบล็อกลอง
try { statement(s) } catch (ExceptiontType name) { statement(s) } finally { statement(s) }
ในกรณีที่มีข้อยกเว้นเกิดขึ้นในบล็อก try บล็อกจะถูกดำเนินการในที่สุดหลังจากที่ catch block ถูกดำเนินการ
ตัวอย่าง
ขั้นตอน 1) คัดลอกโค้ดต่อไปนี้ลงในโปรแกรมแก้ไข
class JavaException { public static void main(String args[]){ try{ int d = 0; int n =20; int fraction = n/d; } catch(ArithmeticException e){ System.out.println("In the catch block due to Exception = "+e); } finally{ System.out.println("Inside the finally block"); } } }
ขั้นตอน 2) บันทึก คอมไพล์ และรันโค้ด
ขั้นตอน 3) ผลผลิตที่คาดหวัง ในที่สุดบล็อกก็ถูกดำเนินการแม้ว่าจะมีข้อยกเว้นเกิดขึ้นก็ตาม
ขั้นตอน 4) เปลี่ยนค่าของตัวแปร d = 1 บันทึก คอมไพล์ และรันโค้ดแล้วสังเกตผลลัพธ์ ด้านล่างของฟอร์ม
สรุป
- An ข้อยกเว้นคือข้อผิดพลาดรันไทม์ ซึ่งขัดขวางโฟลว์ปกติของการทำงานของโปรแกรม การหยุดชะงักระหว่างการทำงานของโปรแกรมเรียกว่าข้อผิดพลาดหรือข้อยกเว้น
- ข้อผิดพลาดแบ่งออกเป็นสองประเภท
- ข้อผิดพลาดเวลาคอมไพล์ - ข้อผิดพลาดทางไวยากรณ์ ข้อผิดพลาดทางความหมาย
- ข้อผิดพลาดระหว่างการทำงาน-ข้อยกเว้น
- A โปรแกรมที่แข็งแกร่งควรจัดการข้อยกเว้นทั้งหมด และดำเนินการโปรแกรมตามปกติต่อไป Java มอบวิธีการจัดการที่ยอดเยี่ยมในตัว
- Exception Handler คือชุดของโค้ดที่ จัดการข้อยกเว้น- สามารถจัดการข้อยกเว้นได้ Java ใช้ try & catch
- ลองบล็อคดูครับ: รหัสปกติจะอยู่ในบล็อกนี้
- จับบล็อก: หากมีข้อผิดพลาดในโค้ดปกติก็จะเข้าไปอยู่ในบล็อกนี้