ข้อยกเว้น Java แบ่งออกเป็นสองประเภท: ตรวจสอบข้อยกเว้นและข้อยกเว้นรันไทม์ ข้อยกเว้นที่ตรวจสอบเป็นข้อยกเว้นที่สามารถประมวลผลได้ในระหว่างขั้นตอนการรวบรวม
ความแตกต่างและการเชื่อมต่อระหว่างข้อยกเว้นที่ตรวจสอบและข้อยกเว้นรันไทม์
คลาสข้อยกเว้นทั่วไป
แสดงรายการข้อยกเว้นรันไทม์ทั่วไปหลายประการ:
แสดงรายการข้อยกเว้นที่ไม่ใช่ตามกฎหมายหลายประการ (ตรวจสอบข้อยกเว้น):
ข้อผิดพลาด
ข้อผิดพลาดโดยทั่วไปหมายถึงปัญหาที่เกี่ยวข้องกับเครื่องเสมือนเช่นระบบขัดข้องข้อผิดพลาดของเครื่องเสมือนความล้มเหลวของการเชื่อมโยงแบบไดนามิก ฯลฯ ข้อผิดพลาดนี้ไม่สามารถกู้คืนได้หรือไม่สามารถจับได้ซึ่งจะทำให้แอปพลิเคชันหยุดชะงัก โดยปกติแอปพลิเคชันไม่สามารถจัดการกับข้อผิดพลาดเหล่านี้ได้ดังนั้นโปรแกรมไม่ควรลองใช้ Catch เพื่อจับวัตถุข้อผิดพลาด ไม่จำเป็นต้องโยนวัตถุข้อผิดพลาดเมื่อกำหนดวิธีการ
การใช้ข้อยกเว้นที่ตรวจสอบ
ดังที่ได้กล่าวไว้ก่อนหน้านี้การตรวจสอบจะต้องจัดการอย่างชัดเจนไม่เช่นนั้นจะมีการรายงานข้อผิดพลาดในการรวบรวมเช่นการประกาศสตรีมอินพุตไฟล์:
FileInputStream FIS = ใหม่ FileInputStream ("test.md");รหัสนี้จะรวบรวมด้วยข้อผิดพลาด
ประเภทข้อยกเว้นที่ไม่มีการจัดการ filenotfoundException
ดังนั้นจึงต้องจัดการอย่างชัดเจนและโดยทั่วไปมีสองวิธีในการจัดการข้อยกเว้นที่ตรวจสอบ:
ถ้าคุณรู้วิธีจัดการกับมันควรใช้ลอง ... จับ ... การประมวลผลบล็อก:
// ตรวจสอบข้อยกเว้นจะต้องจัดการอย่างชัดเจนลอง {fileInputStream fis = ใหม่ fileInputStream ("test.md");} catch (filenotfoundException e) {E.printstackTrace (); System.out.println ("ไฟล์ไม่มีอยู่!");}หากคุณไม่ทราบวิธีจัดการกับมันให้โยนมันลงในวิธีการแล้วจัดการโดยผู้โทรก่อนหน้านี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น filenotfoundexception {// ข้อยกเว้นที่ตรวจสอบจะต้องจัดการอย่างชัดเจน // ข้อยกเว้นถูกโยนลงในวิธีหลักและส่งไปยัง JVM สำหรับการประมวลผล วิธีการจัดการข้อยกเว้นของ JVM คือการพิมพ์ข้อมูลการติดตามสแต็กและยุติโปรแกรมเพื่อเรียกใช้ FileInputStream FIS = ใหม่ FileInputStream ("test.md");} ใช้การโยนเพื่อโยนข้อยกเว้นด้วยตัวเอง
บางครั้งตามความต้องการทางธุรกิจเราจะโยนข้อยกเว้นในโปรแกรมด้วยตัวเอง ตัวอย่างเช่นหากเนื้อหาไฟล์อ่านว่างเปล่าเราคิดว่านี่เป็นข้อยกเว้น ในเวลานี้เราสามารถใช้โยนเพื่อโยนข้อยกเว้นอย่างแข็งขันและจับมันได้:
// ใช้การโยนเพื่อโยนข้อยกเว้นลอง {fileInputStream fis = ใหม่ fileInputStream ("test.md"); if (fis.read () == 0) {โยน iOexception ใหม่ ("ไฟล์ว่าง"); }} catch (ioexception e) {e.printstacktrace ();}หากโยนข้อยกเว้นรันไทม์โปรแกรมสามารถจับได้ด้วยการลอง ... จับ ... หรือไม่สนใจ
การประมวลผลห่วงโซ่ข้อยกเว้น
ในแอปพลิเคชันระดับองค์กรจริงเรามักจะไม่เปิดเผยข้อยกเว้นพื้นฐานไปยังแอปพลิเคชันระดับบนเช่นไม่เปิดเผยข้อยกเว้น SQL ไปยังส่วนต่อประสานผู้ใช้ อันดับแรกสำหรับผู้ใช้การเห็นข้อยกเว้น SQL นั้นไม่เป็นประโยชน์กับพวกเขาและประการที่สองสำหรับผู้ใช้ที่เป็นอันตรายมันไม่ปลอดภัยที่จะเปิดเผยข้อยกเว้นพื้นฐาน
ดังนั้นจะบล็อกข้อยกเว้นพื้นฐานได้อย่างไร? การปฏิบัติตามปกติคือ: โปรแกรมแรกจับข้อยกเว้นเดิมแล้วโยนข้อยกเว้นทางธุรกิจใหม่ ข้อยกเว้นทางธุรกิจใหม่มีข้อมูลแจ้งให้ผู้ใช้ วิธีการจัดการนี้กลายเป็นข้อยกเว้นการแปล ต่อไปนี้แสดงให้เห็นว่าโปรแกรมที่สร้างบล็อกผู้ใช้ข้อยกเว้นพื้นฐาน:
// แสดงให้เห็นถึงห่วงโซ่ข้อยกเว้นและสร้างโมฆะสาธารณะผู้ใช้ createSubsCriber (int subid) พ่น BusinessException {ลอง {// สร้างตรรกะของผู้ใช้ ... } catch (Exception e) {// กระบวนการและบันทึกข้อยกเว้นเดิม ... -คุณจะเห็นได้ว่าโปรแกรมจะซ่อนข้อยกเว้นเดิมและให้ข้อมูลพรอมต์ยกเว้นที่จำเป็นเท่านั้นซึ่งสามารถมั่นใจได้ว่าข้อยกเว้นพื้นฐานจะไม่ถูกขยายไปยังเลเยอร์การนำเสนอซึ่งสอดคล้องกับหลักการห่อหุ้มของวัตถุอย่างสมบูรณ์
การจับข้อยกเว้นประเภทนี้การโยนข้อยกเว้นอื่นและการบันทึกข้อมูลข้อยกเว้นเดิมคือการประมวลผลห่วงโซ่ทั่วไปซึ่งเรียกว่ารูปแบบห่วงโซ่ความรับผิดชอบในรูปแบบการออกแบบ
คำแนะนำหลายประการสำหรับการใช้ข้อยกเว้น
เราใช้ข้อยกเว้นเพื่อให้บรรลุเป้าหมายหลายประการ:
เพื่อจัดการกับเป้าหมายเหล่านี้เราควร:
1. อย่าใช้มากเกินไปหรือพึ่งพา: ข้อยกเว้นนั้นสะดวกมาก แต่อย่าใช้การจัดการข้อยกเว้นสำหรับตรรกะปกติเช่น
// รหัสต้นฉบับถ้า (filesize> 100) {sysotem.out.println ("ไฟล์มีขนาดใหญ่เกินไปโปรดอัปโหลดอีกครั้ง"); ดำเนินการต่อ;} // เปลี่ยนเพื่อใช้ข้อยกเว้นถ้า (ไฟล์> 100) {โยนข้อยกเว้นใหม่ ("ไฟล์มีขนาดใหญ่เกินไปโปรดอัปโหลดอีกครั้ง");} // การทำสิ่งนี้ไม่รับผิดชอบอย่างชัดเจน