1. ข้อยกเว้นคืออะไร?
ก่อนอื่นมาดูตัวอย่างในรูปด้านล่าง:
ในตัวอย่างนี้รหัสข้อผิดพลาดมีอยู่โดยหารด้วย 0. ข้อยกเว้นเนื่องจากหารด้วย 0: arithmeticexception
helloexception.java
แพ็คเกจ com.yiibai.tutorial.exception; คลาสสาธารณะ helloexception {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("สาม"); // ส่วนนี้ไม่มีปัญหา ค่า int = 10 /2; System.out.println ("สอง"); // ส่วนนี้ไม่มีปัญหา ค่า = 10/1; System.out.println ("หนึ่ง"); // ส่วนนี้มีปัญหาหารด้วย 0. // ข้อผิดพลาดเกิดขึ้นที่นี่ ค่า = 10/0; // และรหัสต่อไปนี้จะไม่ถูกเรียกใช้งาน System.out.println ("ไปกันเถอะ!"); -การรันตัวอย่างนี้จะส่งผล:
คุณสามารถดูการแจ้งเตือนบนหน้าจอคอนโซล การแจ้งเตือนข้อผิดพลาดมีความชัดเจนมากรวมถึงข้อมูลเกี่ยวกับบรรทัดของรหัส
มาดูโปรแกรมต่อไปนี้ผ่านกระบวนการในรูปด้านล่าง:
เราจะแก้ไขรหัสของศูนย์รวมที่กล่าวถึงข้างต้น
hellocatchexception.java
แพ็คเกจ com.yiibai.tutorial.exception; ชั้นเรียนสาธารณะ hellocatchexception {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("สาม"); // ส่วนนี้ไม่มีปัญหา ค่า int = 10 /2; System.out.println ("สอง"); // ส่วนนี้ไม่มีปัญหา ค่า = 10/1; System.out.println ("หนึ่ง"); ลอง {// การแบ่งนี้มีปัญหาหารด้วย 0 // มีข้อผิดพลาดเกิดขึ้นที่นี่ ค่า = 10/0; // และรหัสต่อไปนี้จะไม่ถูกเรียกใช้งาน System.out.println ("value =" + value); } catch (arithmeticexception e) {// รหัสในบล็อก catch จะถูกเรียกใช้งาน system.out.println ("ข้อผิดพลาด:" + e.getMessage ()); // รหัสในบล็อก catch จะถูกเรียกใช้งาน system.out.println ("ละเว้น ... "); } // รหัสนี้ดำเนินการ system.out.println ("ไปกันเถอะ!"); -การรันผลลัพธ์ตัวอย่าง:
สาม
สอง
หนึ่ง
ข้อผิดพลาด: / โดยศูนย์
ไม่สนใจ...
ไปกันเถอะ
เราจะอธิบายขั้นตอนต่อไปนี้ดังต่อไปนี้การไหลของภาพตัวอย่าง
2. ลำดับชั้นยกเว้น <br /> นี่เป็นแบบจำลองของกราฟลำดับชั้นของข้อยกเว้น Java
ชั้นเรียนสูงสุดคือ: โยนได้
คลาสย่อยโดยตรงทั้งสองเป็นข้อผิดพลาดและข้อยกเว้น
มีคลาสย่อย RuntimeException ในการถ่ายโอนข้อยกเว้นรวมถึงข้อยกเว้นเวลารวบรวมที่ไม่ได้ตรวจสอบใน Java ตรวจสอบและยกเลิกการตรวจสอบในเวลารวบรวมตามที่อธิบายไว้ในส่วนถัดไปของตัวอย่างการใช้งาน
หมายเหตุ: ชั้นเรียนของคุณควรได้รับการสืบทอดจากสองสาขา: ข้อผิดพลาดหรือข้อยกเว้นไม่ใช่โดยตรงจากการโยนได้
เครื่องเสมือนทำให้เกิดข้อผิดพลาดนี้เมื่อลิงก์แบบไดนามิกล้มเหลวหรือเมื่อความล้มเหลว "ยาก" อื่น ๆ ของเครื่องเสมือนเกิดขึ้น โปรแกรม Java ทั่วไปไม่พบข้อผิดพลาดดังนั้นโปรแกรม Java จึงไม่ได้ทำผิดพลาดใด ๆ โปรแกรมส่วนใหญ่โยนและจับภาพวัตถุที่ได้จากคลาสข้อยกเว้น ข้อยกเว้นบ่งบอกถึงปัญหา แต่ปัญหาเหล่านี้ไม่ใช่ปัญหาที่เป็นระบบอย่างร้ายแรง โปรแกรมส่วนใหญ่ที่คุณเขียนจะโยนและจับข้อยกเว้น
คลาสข้อยกเว้นกำหนดคลาสย่อยจำนวนมากในแพ็คเกจ Java คลาสย่อยเหล่านี้บ่งชี้ว่าอาจมีข้อยกเว้นประเภทต่าง ๆ ตัวอย่างเช่น negativearraysizeException ระบุว่าโปรแกรมกำลังพยายามสร้างอาร์เรย์ที่มีขนาดลบ
ความหมายพิเศษของคลาสย่อยของผู้กำกับในภาษา Java: คลาส RuntimeException แสดงถึงข้อยกเว้นที่เกิดขึ้น (ระหว่างรันไทม์) ในเครื่องเสมือน Java ตัวอย่างของข้อยกเว้นรันไทม์คือข้อยกเว้นของ NullyiibaieRexception ซึ่งได้รับการยกขึ้นเมื่อวิธีการพยายามเข้าถึงสมาชิกของวัตถุผ่านการอ้างอิงโมฆะ Nullyiibaierexception สามารถปรากฏขึ้นได้ทุกที่ที่โปรแกรมพยายามทำวัตถุ ประโยชน์ของการตรวจสอบข้อยกเว้นที่จับได้บ่อยครั้งเกินดุลค่าใช้จ่าย
เนื่องจากข้อยกเว้นรันไทม์เป็นสิ่งที่อยู่ทั่วไปทุกหนทุกแห่งจึงไม่มีประโยชน์ที่จะพยายามจับหรือระบุตลอดเวลา (รหัสที่ไม่สามารถอ่านได้และไม่สามารถใช้งานได้) คอมไพเลอร์อนุญาตให้มีข้อยกเว้นรันไทม์ที่ไม่ได้รับการยกเว้นและระบุ
แพ็คเกจ Java กำหนดคลาส RuntimeException หลายคลาส คุณสามารถจับข้อยกเว้นเหล่านี้ได้เช่นเดียวกับคนอื่น ๆ แต่ไม่จำเป็นต้องมีวิธีระบุว่ามันเป็นดรอปข้อยกเว้นรันไทม์ นอกจากนี้คุณสามารถสร้าง subclass runtimeException ของคุณเอง ข้อยกเว้นรันไทม์ - การสนทนาด้านล่างมีการอภิปรายเชิงลึกเกี่ยวกับเวลาและวิธีการใช้ข้อยกเว้นรันไทม์ 3. ใช้การลองจับเพื่อจัดการข้อยกเว้น
เขียนคลาสที่สืบทอดมาจากข้อยกเว้น
AgeException.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; AgeException ระดับสาธารณะขยายข้อยกเว้น {Public AgeException (ข้อความสตริง) {super (ข้อความ); }} tooyoungexception.javapackage com.yiibai.tutorial.exception.basic; คลาสสาธารณะ toooyoungexception ขยายอายุการรับรู้ {สาธารณะ tooyoungexception (ข้อความสตริง) {super (ข้อความ); - Tooaldexception.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; คลาสสาธารณะ Tooaldexception ขยาย Ageexception {Public TooaldException (ข้อความสตริง) {super (ข้อความ); - และวิธีการคงที่ในการตรวจสอบอายุสำหรับคลาส Ageutils
ageutils.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; Ageutils ชั้นเรียนสาธารณะ {// วิธีนี้ตรวจสอบอายุ // ถ้าอายุน้อยกว่า 18 วิธีนี้จะโยนข้อยกเว้น tooyoungexception // ถ้าอายุมากกว่า 40 วิธีการจะโยนข้อยกเว้นเกินไปการตรวจสอบโมฆะคงที่สาธารณะ (อายุ int) โยน tooyoungexception, tooldexception {ถ้าอายุ <18) {// ถ้าอายุน้อยกว่า 18 โยน tooyoungexception ใหม่ ("อายุ" + อายุ + "เด็กเกินไป"); } อื่นถ้า (อายุ> 40) {// ถ้าอายุมากกว่า 40 จะมีการโยนข้อยกเว้น // วิธีนี้สิ้นสุดที่นี่ โยน tooaldexception ใหม่ ("อายุ" + อายุ + "แก่เกินไป"); } // ถ้าอายุอยู่ระหว่าง 18-40 // รหัสนี้จะถูกดำเนินการ System.out.println ("อายุ" + อายุ + "ตกลง!"); - ตรวจสอบข้อยกเว้นและข้อยกเว้นที่ไม่ได้ตรวจสอบ:
AgeException เป็นข้อยกเว้น subclass ของ TooaldException และ Toooyoungexception2 เป็นคลาสย่อยโดยตรงของ AgeException ดังนั้นพวกเขาจึงเป็น "ข้อยกเว้นที่ตรวจสอบ"
วิธี ageutils.checkage (INT) ได้โยนข้อยกเว้นและจำเป็นต้องแสดงรายการการประกาศวิธีการผ่านคำหลัก "โยน" หรือคุณสามารถประกาศการขว้างระดับมากขึ้น
ageutils.checkage (int) ที่ตั้งจะต้องดำเนินการเพื่อจับข้อยกเว้นหรือโยนมันต่อไป
"ตรวจสอบข้อยกเว้น" ถูกตรวจสอบโดย "Java Compiler"
มีสองตัวเลือก:
trycatchdemo1.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; คลาสสาธารณะ trycatchdemo1 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("เริ่มการสรรหา ... "); // ตรวจสอบ Age System.out.println ("ตรวจสอบอายุของคุณ"); อายุ int = 50; ลอง {ageutils.checkage (อายุ); System.out.println ("คุณผ่านไปแล้ว!"); } catch (tooyoungexception e) {// ทำอะไรบางอย่างที่นี่ .. system.out.println ("คุณยังเด็กเกินไปไม่ผ่าน!"); System.out.println (e.getMessage ()); } catch (tooaldexception e) {// ทำอะไรที่นี่ .. system.out.println ("คุณแก่เกินไปไม่ผ่าน!"); System.out.println (e.getMessage ()); - ในตัวอย่างต่อไปนี้เราจะจับข้อยกเว้น (คลาส HyperException) ผ่านคลาสหลัก
trycatchdemo2.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; คลาสสาธารณะ trycatchdemo2 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("เริ่มการสรรหา ... "); // ตรวจสอบ Age System.out.println ("ตรวจสอบอายุของคุณ"); อายุ int = 15; ลอง {// ที่นี่สามารถโยน tooaldexception หรือ tooyoungexception ageutils.checkage (อายุ); System.out.println ("คุณผ่านไปแล้ว!"); } catch (AgeException E) {// ถ้ามีข้อยกเว้นประเภทของ AgeException // บล็อกจับนี้จะถูกดำเนินการ System.out.println ("อายุของคุณไม่ถูกต้องคุณจะไม่ผ่าน"); System.out.println (e.getMessage ()); - ข้อยกเว้นที่แตกต่างกันสามารถจัดกลุ่มเป็นบล็อกเพื่อจัดการหากพวกเขาได้รับการจัดการในลักษณะเดียวกันกับโปรแกรมลอจิคัล
trycatchdemo3.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; คลาสสาธารณะ trycatchdemo3 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("เริ่มการสรรหา ... "); // ตรวจสอบ Age System.out.println ("ตรวจสอบอายุของคุณ"); อายุ int = 15; ลอง {// ที่นี่สามารถโยน tooaldexception หรือ tooyoungexception ageutils.checkage (อายุ); System.out.println ("คุณผ่านไปแล้ว!"); } catch (tooyoungexception | TooaldException e) {// จับข้อยกเว้นหลายข้อในหนึ่งบล็อก System.out.println ("อายุของคุณไม่ถูกต้องคุณไม่ผ่าน"); System.out.println (e.getMessage ()); - 4. ลองจับใจครั้งสุดท้าย
เราคุ้นเคยกับการจับข้อผิดพลาดผ่านบล็อกลองจับ ลองจับกับข้อยกเว้นอย่างสมบูรณ์
ลอง {// ทำอะไรที่นี่} catch (exception1 e) {// ทำอะไรที่นี่} catch (exception2 e) {// ทำอะไรที่นี่} ในที่สุด {// ในที่สุดบล็อกจะถูกดำเนินการเสมอ // ทำอะไรที่นี่} trycatchfinallydemo.java
แพ็คเกจ com.yiibai.tutorial.exception.basic; คลาสสาธารณะ trycatchfinallydemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริงข้อความ = "001234a2"; ค่า int = tointeger (ข้อความ); System.out.println ("value =" + value); } สาธารณะคงที่ int tointeger (ข้อความสตริง) {ลอง {system.out.println ("เริ่มต้นวิเคราะห์ข้อความ:" + ข้อความ); // ข้อยกเว้นสามารถโยนได้ที่นี่ (numberFormatexception) ค่า int = integer.parseint (ข้อความ); ค่าส่งคืน; } catch (numberFormatexception e) {// ในกรณีของ 'ข้อความ' ไม่ใช่ตัวเลข // บล็อกจับนี้จะถูกดำเนินการ System.out.println ("ข้อยกเว้นรูปแบบตัวเลข" + e.getMessage ()); // ส่งคืน 0 ถ้า numberFormatexception เกิดขึ้นส่งคืน 0; } ในที่สุด {system.out.println ("สิ้นสุดข้อความแยกวิเคราะห์:" + ข้อความ); -นี่คือกระบวนการของโปรแกรม บล็อกในที่สุดจะถูกดำเนินการเสมอไม่ว่าในกรณีใด ๆ
5. ข้อยกเว้นโดยรอบ
person.java
แพ็คเกจ com.yiibai.tutorial.exception.wrap; บุคคลระดับสาธารณะ {สตริงสุดท้ายคงที่สาธารณะ = "ชาย"; สตริงสุดท้ายคงที่สาธารณะหญิง = "หญิง"; ชื่อสตริงส่วนตัว; เพศสตริงส่วนตัว อายุ int ส่วนตัว; บุคคลสาธารณะ (ชื่อสตริง, เพศสตริง, อายุ int) {this.name = name; this.gender = เพศ; this.age = อายุ; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } สตริงสาธารณะ getGender () {กลับเพศ; } โมฆะสาธารณะ setGender (เพศสตริง) {this.gender = เพศ; } public int getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุ int) {this.age = อายุ; - genderexception.java
แพ็คเกจ com.yiibai.tutorial.exception.wrap; // ข้อยกเว้นทางเพศระดับ Genderexception ขยายข้อยกเว้น {Public Genderexception (ข้อความสตริง) {super (ข้อความ); - แพ็คเกจ ValidateException Class มีข้อยกเว้นอื่น ๆ
ValidateException.java
แพ็คเกจ com.yiibai.tutorial.exception.wrap; Public Class ValidateException ขยายข้อยกเว้น {// ห่อข้อยกเว้น Public ValidateException (Exception E) {Super (E); - validateutils.java
แพ็คเกจ com.yiibai.tutorial.exception.wrap; นำเข้า com.yiibai.tutorial.exception.basic.ageutils; ชั้นเรียนสาธารณะ Validateutils {Public Public Moid Checkpers (บุคคลบุคคล) โยน ValidateException {ลอง {// ตรวจสอบอายุ // ใช้ได้ถ้าระหว่าง 18-40 // วิธีนี้สามารถโยน tooldexception, tooyoungexception ageutils.checkage (person.getage ()); } catch (Exception e) {// ถ้าไม่ถูกต้อง // ห่อข้อยกเว้นนี้โดย ValidateException และโยน JalidateException ใหม่ (E); } // ถ้าบุคคลนั้นเป็นผู้หญิงเช่นไม่ถูกต้อง ถ้า (person.getGender (). เท่ากับ (person.female)) {genderexception e = new genderexception ("ไม่ยอมรับผู้หญิง"); โยน ValidateException ใหม่ (E); - wrapperexceptiondemo.java
แพ็คเกจ com.yiibai.tutorial.exception.wrap; คลาสสาธารณะ wrapperexceptionDemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// การรับสมัครผู้เข้าร่วมหนึ่งคน บุคคล = บุคคลใหม่ ("แต่งงาน", person.female, 20); ลอง {// ข้อยกเว้นอาจเกิดขึ้นที่นี่ validateutils.checkperson (บุคคล); } catch (validateException wrap) {// รับสาเหตุจริง // อาจเป็น tooyoungexception, tooldexception, genderexception exception สาเหตุ = (ข้อยกเว้น) wrap.getCause (); ถ้า (สาเหตุ! = null) {system.out.println ("ไม่ผ่าน, สาเหตุ:" + cause.getMessage ()); } else {system.out.println (wrap.getMessage ()); -6. RuntimeException และ subclasses คลาส runtimeException และคลาสย่อยของมันเป็นทั้ง "ข้อยกเว้นที่ไม่ได้ตรวจสอบ" มันไม่ได้ตรวจสอบในเวลารวบรวมโดยคอมไพเลอร์ Java ในบางกรณีคุณสามารถสืบทอดจากสาขานี้เพื่อเขียนข้อยกเว้นของคุณเอง
ด้านล่างนี้เป็นบางชั้นเรียนที่อยู่ในสาขา RuntimeException (แน่นอนว่าไม่ใช่ทั้งหมด)
ตัวอย่างบางส่วนของข้อยกเว้นการจัดการประเภทนี้:
6.1- NullyibaieRexception
นี่เป็นข้อยกเว้นที่พบบ่อยที่สุดและมักจะทำให้เกิดข้อผิดพลาดในโปรแกรม ข้อยกเว้นจะถูกโยนลงเมื่อคุณเรียกวิธีการหรือเข้าถึงฟิลด์ของวัตถุเปล่า
nullyiibaierexceptiondemo.java
แพ็คเกจ com.yiibai.tutorial.exception.runtime; คลาสสาธารณะ NullyibaieRexceptionDemo {// ตัวอย่างเช่นนี่คือวิธีที่สามารถส่งคืนสตริง null สตริงคงที่สาธารณะ getString () {ถ้า (1 == 2) {return "1 == 2 !!"; } return null; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// นี่คือวัตถุที่อ้างอิงไม่เป็นโมฆะ String text1 = "Hello Exception"; // เรียกวิธีการดึงความยาวสตริง ความยาว int = text1.length (); System.out.println ("ความยาว text1 =" + ความยาว); // นี่คือวัตถุที่อ้างอิงเป็นโมฆะ String text2 = getString (); // เรียกวิธีการดึงความยาวสตริง // NullyiibaierException จะเกิดขึ้นที่นี่ // มันเป็นข้อยกเว้นที่เกิดขึ้นที่รันไทม์ (ประเภทของ runtimeException) // คอมไพเลอร์ Javac ไม่ได้บังคับให้คุณใช้บล็อกลองจับเพื่อจัดการความยาว = text2.length (); System.out.println ("เสร็จสิ้น!"); -ผลลัพธ์ของการรันตัวอย่าง:
ในความเป็นจริงการลองจับสามารถใช้ในการจับและจัดการข้อยกเว้นนี้เช่นเมื่อจัดการข้อยกเว้นอื่น ๆ อย่างไรก็ตามนี่เป็นกลไกและโดยปกติเราควรตรวจสอบเพื่อให้แน่ใจว่าวัตถุนั้นไม่ได้เป็นโมฆะก่อนที่จะใช้มัน
คุณสามารถแก้ไขรหัสด้านบนเพื่อให้คล้ายกับต่อไปนี้เพื่อหลีกเลี่ยงข้อยกเว้นตัวชี้ว่าง:
// นี่คือ object null.string text2 = getString (); // ตรวจสอบเพื่อให้แน่ใจว่า 'text2' ไม่ใช่ null./// แทนที่จะใช้ try-catch.if (text2! = null) {length = text2.length ();}; 6.2- ArrayIndexofBoundException
ข้อยกเว้นนี้เกิดขึ้นเมื่อคุณพยายามเข้าถึงองค์ประกอบอาร์เรย์ด้วยดัชนีที่ไม่ถูกต้อง ตัวอย่างเช่นอาร์เรย์มี 10 องค์ประกอบในการเข้าถึง แต่คุณกำลังเข้าถึงองค์ประกอบด้วยดัชนี 20
ArrayIndexofboundsexceptionDemo.java
แพ็คเกจ com.yiibai.tutorial.exception.runtime; คลาสสาธารณะ arrayIndExofBoundSexceptionDemo {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {สตริง [] strs = สตริงใหม่ [] {"หนึ่ง", "สอง", "สาม"}; // การเข้าถึงองค์ประกอบมีดัชนี 0. สตริง str1 = strs [0]; System.out.println ("สตริงที่ 0 =" + str1); // การเข้าถึงองค์ประกอบมีดัชนี 5. // arrayIndexofboundsexception เกิดขึ้นที่นี่ string str2 = strs [5]; System.out.println ("สตริงที่ 5 =" + str2); - เพื่อหลีกเลี่ยง arrayIndexofboundsexception เราควรตรวจสอบอาร์เรย์มากกว่าการใช้ลองจับ
if (strs.length> 5) {string str2 = strs [5]; System.out.println ("สตริงที่ 5 =" + str2);} else {system.out.println ("ไม่มีองค์ประกอบที่มีดัชนี 5");}ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน