การจัดการข้อยกเว้น Java
ข้อยกเว้นข้อผิดพลาดบางในโปรแกรม แต่ไม่ได้ข้อผิดพลาดทั้งหมดเป็นข้อยกเว้นและบางครั้งความผิดพลาดสามารถหลีกเลี่ยงได้
ตัวอย่างเช่นรหัสของคุณน้อยอัฒภาคแล้ววิ่งออกไปจากผลการคือการแจ้งให้ java.lang.Error ผิดถ้าคุณใช้ System.out.println (11/0) แล้วคุณจะทำเพราะคุณใช้ตัวหาร 0 มันจะถูกโยนยกเว้น java.lang.ArithmeticException
มีหลายเหตุผลสำหรับข้อยกเว้นเกิดขึ้นมักจะมีประเภทต่อไปนี้:
- ผู้ใช้ป้อนข้อมูลที่ผิดกฎหมาย
- เพื่อเปิดไฟล์ไม่ได้อยู่
- การเชื่อมต่อเครือข่ายการสื่อสารถูกขัดจังหวะหรือหน่วยความจำ JVM ล้น
ข้อยกเว้นเหล่านี้อย่างใดอย่างหนึ่งเพราะความผิดพลาดของผู้ที่เกิดข้อผิดพลาดในการดำเนินการเกิดเพราะมีข้อผิดพลาดทางกายภาพอื่น ๆ -
เพื่อให้เข้าใจถึงการจัดการข้อยกเว้น Java เป็นวิธีการทำงานคุณจะต้องมีดังต่อไปนี้สามประเภทของข้อยกเว้น:
- การตรวจสอบข้อยกเว้น: ตัวแทนมากที่สุดการตรวจสอบข้อยกเว้นเป็นข้อยกเว้นเนื่องจากข้อผิดพลาดของผู้ใช้หรือปัญหาที่เกิดขึ้นก็เป็นโปรแกรมเมอร์ที่คาดเดา ตัวอย่างเช่นเมื่อคุณต้องการที่จะเปิดไฟล์ไม่ได้อยู่ที่เกิดข้อยกเว้นข้อยกเว้นที่ไม่สามารถละเลยเพียงที่รวบรวมเวลา
- ยกเว้นมีแนวโน้มที่จะเป็นโปรแกรมเมอร์ที่จะหลีกเลี่ยงการทำงานผิดปกติ: เวลาทำงานยกเว้น ในทางตรงกันข้ามกับข้อยกเว้นการตรวจสอบข้อยกเว้นรันไทม์สามารถปฏิเสธที่รวบรวมเวลา
- ข้อผิดพลาด: ข้อผิดพลาดที่ไม่ได้ผิดปกติ แต่จากคำถามของการควบคุมของโปรแกรมเมอร์ ข้อผิดพลาดในรหัสที่มักจะถูกละเลย ตัวอย่างเช่นเมื่อกองล้นข้อผิดพลาดเกิดขึ้นพวกเขาไม่สามารถตรวจสอบที่รวบรวมเวลา
ลำดับชั้นยกเว้น
ทุกชั้นเรียนยกเว้นสืบทอดจาก java.lang.Exception subclass
ระดับข้อยกเว้นเป็น subclass ของชั้น Throwable นอกเหนือไปจากชั้นยกเว้น Throwable มี subclass ของข้อผิดพลาด
โปรแกรมจาวามักจะไม่ได้จับข้อผิดพลาด ข้อผิดพลาดมักเกิดขึ้นเมื่อมีความผิดร้ายแรงที่พวกเขาจะมองเห็นด้านนอกการประมวลผลโปรแกรม Java
สภาพแวดล้อมรันไทม์ข้อผิดพลาดมาใช้เพื่อระบุข้อผิดพลาดเกิดขึ้น
ยกตัวอย่างเช่นหน่วยความจำ JVM ล้น โดยทั่วไปโปรแกรมไม่ได้กู้คืนจากข้อผิดพลาด
ระดับยกเว้นมีสองหลักหมวดย่อย: ระดับ IOException และชั้น RuntimeException
Built-in ชั้น Java (ต่อไปจะอธิบาย) ก็มีมากที่สุดของการตรวจสอบตามปกติและไม่ได้ตรวจสอบข้อยกเว้น
Built-in ชั้นยกเว้น Java
ภาษา Java กำหนดข้อยกเว้นหลายชั้นเรียนในแพคเกจ java.lang มาตรฐาน
มาตรฐานการเรียนการยกเว้น runtime เป็น subclasses ของชั้นเรียนยกเว้นที่พบมากที่สุด เนื่องจากแพ็กเกจ java.lang ถูกโหลดโดยค่าเริ่มต้นให้กับทุกโปรแกรมจาวาดังนั้นส่วนใหญ่มาจากการเรียนการยกเว้นความผิดปกติ Runtime สืบทอดมาสามารถนำมาใช้โดยตรง
ตามที่ห้องสมุดชั้น Java ต่าง ๆ นอกจากนี้ยังกำหนดจำนวนของข้อยกเว้นอื่น ๆ ตารางต่อไปนี้แสดง Java ยกเว้นไม่ถูกตรวจสอบ
ผิดปกติ | ลักษณะ |
---|---|
ArithmeticException | เมื่อมีเงื่อนไขการทำงานผิดปกติ, ข้อยกเว้นนี้จะถูกโยนทิ้ง ยกตัวอย่างเช่นจำนวนเต็ม "หารด้วยศูนย์" โยนสแตนซ์ของคลาสนี้ |
ArrayIndexOutOfBoundsException | ด้วยดัชนีที่ผิดกฎหมายในการเข้าถึงอาร์เรย์โยน หากดัชนีมีค่าเป็นลบหรือมากกว่าหรือเท่ากับขนาดของอาร์เรย์ดัชนีเป็นดัชนีที่ผิดกฎหมาย |
ArrayStoreException | พยายามที่จะเก็บผิดประเภทของวัตถุลงในอาร์เรย์ยกเว้นโยน |
ClassCastException | เมื่อคุณพยายามที่จะโยนวัตถุไม่ได้เป็นตัวอย่างของประเภทรองโยน |
IllegalArgumentException | โยนเพื่อแสดงให้เห็นว่าวิธีการที่ได้รับการผ่านการโต้แย้งที่ผิดกฎหมายหรือไม่เหมาะสม |
IllegalMonitorStateException | โยนเพื่อบ่งชี้ว่าด้ายมีความพยายามที่จะรอบนจอภาพของวัตถุหรือที่จะแจ้งให้วัตถุอื่น ๆ ที่กำลังรอการตรวจสอบโดยไม่ต้องด้ายจอภาพที่ระบุไว้ |
IllegalStateException | ในกรณีของเวลาที่ผิดกฎหมายหรือไม่เหมาะสมที่จะเรียกวิธีการที่จะสร้างสัญญาณ ในคำอื่น ๆ สภาพแวดล้อม Java หรือโปรแกรม Java ไม่ได้อยู่ในสภาวะที่เหมาะสมสำหรับการดำเนินการที่ร้องขอ |
IllegalThreadStateException | กระทู้ไม่ได้อยู่ในสถานะที่เหมาะสมเมื่อดำเนินการที่ร้องขอต้องโยน |
IndexOutOfBoundsException | มันแสดงให้เห็นดัชนีการจัดเรียง (เช่นการเรียงลำดับอาร์เรย์สตริงหรือเวกเตอร์) โยนออกมาจากช่วง |
NegativeArraySizeException | ถ้าโปรแกรมประยุกต์พยายามที่จะสร้างอาร์เรย์ที่มีขนาดเชิงลบโยน |
NullPointerException | เมื่อโปรแกรมประยุกต์พยายามที่จะใช้วัตถุในความต้องการของท้องถิ่น null โยน |
NumberFormatException | เมื่อโปรแกรมประยุกต์พยายามที่จะแปลงสตริงเป็นชนิดที่เป็นตัวเลข แต่ที่สตริงไม่สามารถแปลงเป็นรูปแบบที่เหมาะสม dished ออกผิดปกติ |
SecurityException | โดยผู้จัดการการรักษาความปลอดภัยพ่นยกเว้นก็แสดงการละเมิดการรักษาความปลอดภัย |
StringIndexOutOfBoundsException | ยกเว้นจากนี้ String พ่นวิธีการที่จะระบุว่าดัชนีเป็นลบหรือมากกว่าขนาดของสตริง |
UnsupportedOperationException | เมื่อดำเนินการที่ร้องขอไม่สนับสนุนการโยน |
ตารางต่อไปนี้แสดง Java ที่กำหนดไว้ในแพคเกจ java.lang ตรวจสอบการเรียนการยกเว้น
ผิดปกติ | ลักษณะ |
---|---|
ClassNotFoundException | แอพลิเคชันพยายามโหลดระดับที่คุณไม่สามารถหาระดับที่สอดคล้องกันโยน |
CloneNotSupportedException | เมื่อคุณเรียก Object ชั้น clone วิธีการโคลนวัตถุ แต่ระดับของวัตถุไม่สามารถดำเนินการ Cloneable อินเตอร์เฟซโยน |
IllegalAccessException | เมื่อปฏิเสธการเข้าถึงระดับโยน |
InstantiationException | เมื่อคุณพยายามที่จะใช้ Class ชั้น newInstance สร้างตัวอย่างของวิธีการเรียนการกำหนดวัตถุชั้นเพราะมันเป็นอินเตอร์เฟซหรือระดับนามธรรมไม่สามารถ instantiated, dished ออกผิดปกติ |
InterruptedException | ด้ายถูกขัดจังหวะด้วยด้ายอีกข้อยกเว้นนี้จะถูกโยนทิ้ง |
NoSuchFieldException | ตัวแปรที่ร้องขอไม่ได้อยู่ |
NoSuchMethodException | วิธีการขอไม่อยู่ |
ความผิดปกติ
รายการต่อไปนี้เป็นวิธีการหลักระดับ Throwable:
เลขที่ | วิธีการและรายละเอียด |
---|---|
1 | String สาธารณะ getMessage () ส่งกลับข้อมูลรายละเอียดเกี่ยวกับข้อยกเว้นที่เกิดขึ้น ข่าวเริ่มต้นได้ในระดับสร้างของ Throwable |
2 | ประชาชน Throwable getCause () ส่งกลับวัตถุ Throwable ที่แสดงถึงเหตุผลในการยกเว้น |
3 | สาธารณะ String toString () ผลการค้นหาโดยใช้ getMessage () ผลตอบแทนชื่อของชั้นเรียนของน้ำตก |
4 | โมฆะสาธารณะ printStackTrace () toString พิมพ์ () ผลและสแต็คระดับ System.err คือกระแสออกข้อผิดพลาด |
5 | ประชาชน StackTraceElement [] getStackTrace () ก็จะส่งกลับอาร์เรย์ที่มีระดับกอง 0 องค์ประกอบห้อยแสดงให้เห็นถึงด้านบนของสแต็ค, องค์ประกอบสุดท้ายหมายถึงด้านล่างสแต็คโทรวิธีของสแต็ค |
6 | ประชาชน Throwable fillInStackTrace () สแต็ควัตถุ Throwable เต็มไปด้วยในระดับปัจจุบันของระดับโทรสแต็คเพิ่มระดับสแต็คของข้อมูลใด ๆ ก่อนหน้า |
จับข้อยกเว้น
ใช้และพยายามจับคำหลักที่สามารถจับข้อยกเว้น ลอง / จับกระชากข้อยกเว้นสถานที่ที่อาจเกิดขึ้น
ไวยากรณ์รหัสลอง / จับบล็อกเรียกว่ารหัสป้องกันโดยใช้ลอง / จับเป็นดังนี้:
try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 }
ตรวจจับคำสั่งมีข้อยกเว้นที่จะจับประเภทของคำสั่ง เมื่อการป้องกันรหัสป้องกันเมื่อมีข้อยกเว้นเกิดขึ้นพยายามที่ด้านหลังของการป้องกันการจับจะถูกตรวจสอบ
หากข้อยกเว้นที่มีอยู่ในการป้องกันการจับข้อยกเว้นจะถูกส่งผ่านไปยังบล็อกจับและผ่านพารามิเตอร์วิธีนี้เหมือนกัน
ตัวอย่าง
ตัวอย่างต่อไปนี้ได้ประกาศอาร์เรย์สององค์ประกอบเมื่อรหัสพยายามเข้าถึงองค์ประกอบที่สามของอาร์เรย์เมื่อมันจะโยนข้อยกเว้น
// 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } }
คอมไพล์โค้ดข้างต้นและเรียกใช้การส่งออกต่อไปนี้:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block
จับหลายบล็อก
ใหญ่ของบล็อกจับรหัสหลังจากการป้องกันรหัสที่เรียกว่าลองที่จะปฏิบัติตามจับหลาย
ไวยากรณ์จับบล็อกหลายเป็นดังนี้:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }
ข้อมูลโค้ดข้างต้นมีสามจับบล็อก
คุณสามารถเพิ่มจำนวนของการจับบล็อกใด ๆ ที่อยู่เบื้องหลังคำสั่งลอง
หากเกิดข้อยกเว้นในรหัสป้องกันยกเว้นจะโยนไปจับบล็อกแรก
ถ้าคุณโยนข้อยกเว้นชนิดข้อมูลที่ไม่ตรงกันของ ExceptionType1 ที่มันจะถูกจับ
ถ้าไม่ได้ก็จะถูกโอนไปจับบล็อกที่สอง
ดังนั้นจนกว่าข้อยกเว้นที่ถูกจับได้โดยการจับหรือบล็อกใด ๆ
ตัวอย่าง
ตัวอย่างนี้แสดงให้เห็นว่าการใช้หลายลอง / จับ
try { file = new FileInputStream(fileName); x = (byte) file.read(); }catch(IOException i) { i.printStackTrace(); return -1; }catch(FileNotFoundException f) //Not valid! { f.printStackTrace(); return -1; }
พ่นคำ / โยน:
หากวิธีการไม่จับข้อยกเว้นการตรวจสอบแล้ววิธีการที่จะต้องใช้พ่นคำหลักที่จะประกาศ โยนคำหลักที่วางไว้ในตอนท้ายของลายเซ็นของวิธีการ
นอกจากนี้คุณยังสามารถใช้คำหลักโยนโยนข้อยกเว้นไม่ว่าจะเป็นใหม่หรือใหม่ instantiated จับ
ประกาศวิธีการต่อไปพ่นยกเว้น RemoteException:
import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition }
วิธีการสามารถประกาศที่จะโยนข้อยกเว้นหลายคั่นด้วยเครื่องหมายจุลภาคระหว่างหลายข้อยกเว้น
ยกตัวอย่างเช่นการประกาศวิธีการต่อไปพ่น RemoteException และ InsufficientFundsException:
import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition }
คำหลักในที่สุด
ในที่สุดคำหลักที่ใช้ในการสร้างบล็อกรหัสหลังจากการป้องกันรหัสพยายามที่จะทำการ
หรือไม่ข้อยกเว้นเกิดขึ้นในที่สุดรหัสบล็อกจะถูกดำเนินการ
ในบล็อกสุดท้ายคุณก็สามารถเรียกใช้ทำความสะอาดผลพวงของลักษณะของประเภทของคำสั่งสิ้นสุดที่
ในที่สุดก็ปรากฏในบล็อกบล็อกจับในที่สุดไวยากรณ์เป็นดังนี้:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
ตัวอย่าง
public class ExcepTest{ public static void main(String args[]){ int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } }
ตัวอย่างข้างต้นรวบรวมผลมีดังนี้
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed
โปรดทราบว่าเรื่องดังต่อไปนี้:
- จับไม่สามารถอยู่ได้เป็นอิสระจากความพยายาม
- ในลอง / จับบล็อกไม่ได้เพิ่มเข้ามาหลังจากความต้องการในที่สุดก็บังคับ
- ไม่ได้หลังจากลองจับบล็อกก็ไม่ปิดกั้นในที่สุด
- ลองจับในที่สุดก็ไม่สามารถเพิ่มรหัสใด ๆ ระหว่างบล็อก
ยกเว้นที่กำหนดเองคำสั่ง
ใน Java คุณสามารถกำหนดข้อยกเว้น จุดต่อไปนี้ต้องจำไว้ในการเขียนข้อยกเว้นการเรียนของคุณเอง
- ข้อยกเว้นทั้งหมดจะต้อง subclasses Throwable
- หากคุณต้องการที่จะเขียนชั้นยกเว้นการตรวจสอบคุณจะต้องรับช่วงชั้นข้อยกเว้น
- หากคุณต้องการที่จะเขียนชั้นยกเว้น Runtime คุณจะต้องรับช่วงชั้น RuntimeException
คุณสามารถกำหนดระดับข้อยกเว้นของคุณเองเช่นนี้
class MyException extends Exception{ }
เพียงระดับข้อยกเว้นสืบทอดการสร้างคลาสยกเว้นมีการตรวจสอบการเรียนการยกเว้น
ชั้น InsufficientFundsException ต่อไปนี้เป็นผู้ใช้กำหนดระดับยกเว้นที่สืบทอดจากข้อยกเว้น
ยกเว้นชั้นและชั้นเรียนอื่น ๆ ประกอบด้วยตัวแปรและวิธีการ
ตัวอย่าง
// 文件名InsufficientFundsException.java import java.io.*; public class InsufficientFundsException extends Exception { private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } }
แสดงให้เห็นถึงวิธีการใช้งานระดับข้อยกเว้นของเราเอง
ในคลาส CheckingAccount ต่อไปนี้ประกอบด้วยถอน () วิธีการพ่น InsufficientFundsException ข้อยกเว้น
// 文件名称 CheckingAccount.java import java.io.*; public class CheckingAccount { private double balance; private int number; public CheckingAccount(int number) { this.number = number; } public void deposit(double amount) { balance += amount; } public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } public double getBalance() { return balance; } public int getNumber() { return number; } }
โปรแกรมต่อไปนี้แสดงให้เห็นถึงวิธีการเรียกเงินฝากระดับ BankDemo CheckingAccount () และถอน () วิธีการ
//文件名称 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } }
รวบรวมข้อสามไฟล์และทำงาน BankDemo โปรแกรมที่ได้รับผลดังต่อไปนี้:
Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25) at BankDemo.main(BankDemo.java:13)
ข้อยกเว้นทั่วไป
มันกำหนดสองประเภทของข้อยกเว้นและข้อผิดพลาดในชวา
- JVM (โปรแกรม Java Virtual Machine) ยกเว้นข้อยกเว้นโยนโดย JVM หรือข้อผิดพลาด ตัวอย่างเช่นระดับ NullPointerException ชั้น ArrayIndexOutOfBoundsException ชั้น ClassCastException
- ยกเว้นระดับโปรแกรม: โปรแกรม API โดยโปรแกรมหรือโยน สำหรับการเรียน IllegalArgumentException ตัวอย่างเช่นระดับ IllegalStateException