จับข้อยกเว้นหลายรายการใน Java
เพื่อจัดการข้อยกเว้นหลายข้อในจาวา เราสามารถ:
- ใช้บล็อกจับหลายรายการ:ที่นี่คุณสามารถจัดการข้อยกเว้นหลายรายการภายใต้บล็อกจับหลายรายการสำหรับบล็อกลองที่สอดคล้องกัน โฟลว์ของโปรแกรมจะมาถึง catch block ทีละบล็อกโดยอัตโนมัติ จากนั้นจะพบ catch block ที่ตรงกันตามข้อยกเว้นและจะถูกจัดการตามนั้น
- ใช้คำสั่ง Catch หลายรายการในอาร์กิวเมนต์ของ Catch Block:คุณลักษณะนี้มาจาก Java 7 ที่นี่คุณสามารถจัดการข้อยกเว้นหลายรายการภายใต้ catch block เดียว (คั่นด้วยเครื่องหมายไปป์) สำหรับ try block ที่สอดคล้องกัน การไหลของโปรแกรมจะมาถึง catch block โดยอัตโนมัติ จากนั้นจะพบข้อยกเว้นที่สอดคล้องกันภายในอาร์กิวเมนต์ของ catch block สำหรับ try block และจะถูกจัดการตามนั้น
บล็อกจับหลายอัน
ใน Java บล็อกลองเดียวสามารถมีบล็อกจับได้หลายบล็อก
เหตุใดเราจึงต้องใช้ catch catch หลายอันใน Java
บล็อกจับจำนวนมากใน Java ใช้เพื่อจัดการข้อยกเว้นประเภทต่างๆ เมื่อคำสั่งในบล็อกลองเดียวสร้างข้อยกเว้นหลายรายการ เราจำเป็นต้องมีบล็อกจับหลายรายการเพื่อจัดการกับข้อยกเว้นประเภทต่างๆ กลไกนี้เรียกว่าmulti-catch block ใน java
บล็อกลองสามารถตามด้วยบล็อกจับหนึ่งบล็อกขึ้นไป แต่ละ catch block ต้องมีตัวจัดการข้อยกเว้นที่แตกต่างกัน คุณสามารถตรวจจับข้อยกเว้นที่แตกต่างกันในcatch block ที่แตกต่างกันได้หากมีตัวจัดการข้อยกเว้นที่แตกต่างกัน เมื่อเกิดข้อยกเว้นในบล็อก try บล็อก catch ที่สอดคล้องกัน ซึ่งจัดการข้อยกเว้นนั้นจะดำเนินการ ดังนั้น หากคุณต้องทำงานต่างๆ กันโดยมีข้อยกเว้นต่างๆ เกิดขึ้น คุณสามารถใช้ multi-try catch ใน Java ได้
ไวยากรณ์
ไวยากรณ์สำหรับการใช้การลองครั้งเดียวกับ catch block มากกว่าหนึ่งรายการใน java มีดังนี้:
try
{
statements;
}
catch(ExceptionType1 e1)
{
statements;
}
catch(ExceptionType2 e2)
{
statements;
}
ในกรณีที่วัตถุยกเว้นไม่ตรงกับ catch block แรก บล็อก catch ที่สองจะตรวจสอบ และอื่น ๆ
มีเพียงหนึ่งข้อยกเว้นเท่านั้นที่เกิดขึ้นในแต่ละครั้ง และในแต่ละครั้งจะมีการดำเนินการ catch block เดียวเท่านั้น บล็อกจับทั้งหมดต้องจัดเรียงในลักษณะที่ข้อยกเว้นต้องมาจากคลาสย่อยแรกและซูเปอร์คลาส กล่าวคือ การจับสำหรับ ArithmeticException ต้องมาก่อนการจับสำหรับข้อยกเว้น
ผังงานของ Multi-catch Block
ตัวอย่าง
ตัวอย่างที่ 1
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (ArithmeticException e) {
System.out.println(e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
/ by zero
- ArithmeticExceptionเนื่องจากเรากำลังพยายามหารตัวเลขด้วย 0
- ArrayIndexOutOfBoundExceptionเนื่องจากเราได้ประกาศอาร์เรย์จำนวนเต็มใหม่ที่มีขอบเขตอาร์เรย์ตั้งแต่ 0 ถึง 9 และเรากำลังพยายามกำหนดค่าให้กับดัชนี 10
การเชื่อมโยงของตัวดำเนินการกำหนด=เป็นแบบขวาไปซ้าย ดังนั้นArithmeticExceptionจะถูกส่งก่อนด้วยข้อความ / โดยศูนย์
ตัวอย่างที่ 2
class Example2{
public static void main(String args[]){
try{
int a[]=new int[7];
a[4]=30/0;
System.out.println("First print statement in try block");
}
catch(ArithmeticException e){
System.out.println("Warning: ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("Warning: ArrayIndexOutOfBoundsException");
}
catch(Exception e){
System.out.println("Warning: Some Other exception");
}
System.out.println("Out of try-catch block...");
}
}
Warning: ArithmeticException
Out of try-catch block...
จับข้อยกเว้นมากกว่าหนึ่งประเภทด้วยตัวจัดการข้อยกเว้นหนึ่งตัว
ใน Java 7 และใหม่กว่า บล็อก catchได้รับการปรับปรุงเพื่อจัดการข้อยกเว้นหลายรายการในบล็อกcatch เดียว หากคุณพบข้อยกเว้นหลายรายการและมีรหัสที่คล้ายกัน
catch block เดียวมีความเป็นไปได้ในการจัดการ (catch) ข้อยกเว้นหลายรายการโดยแยกแต่ละรายการด้วย | (สัญลักษณ์ไปป์) ในบล็อกดักจับ
คุณลักษณะนี้สามารถลดความซ้ำซ้อนของรหัสและเพิ่มประสิทธิภาพ นอกจากนี้ยังลดสิ่งล่อใจในการตรวจจับข้อยกเว้นที่กว้างเกินไปอีกด้วย. โค้ดไบต์ที่สร้างขึ้นขณะคอมไพล์โปรแกรมนี้จะเล็กกว่าโปรแกรมที่มี catch block หลายอันเนื่องจากไม่มีรหัสซ้ำซ้อน
พิจารณาตัวอย่างต่อไปนี้ ซึ่งมีโค้ดที่ซ้ำกันในแต่ละ บล็อก catch :
catch (IOException ex) {
logger.log(ex);
ex.printStackTrace();
catch (SQLException ex) {
logger.log(ex);
ex.printStackTrace();
}
ใน Java SE 7 และใหม่กว่า เราสามารถกำจัดโค้ดที่ซ้ำกันได้โดยใช้วิธีการนี้
ไวยากรณ์
ในcatchส่วนคำสั่ง ให้ระบุประเภทของข้อยกเว้นที่บล็อกสามารถจัดการได้ และแยกข้อยกเว้นแต่ละประเภทด้วยแถบแนวตั้ง ( |):
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
ตัวอย่าง
ตัวอย่างที่ 1
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
/ by zero
ไบต์โค้ดที่สร้างขึ้นขณะคอมไพล์โปรแกรมนี้จะเล็กกว่าโปรแกรมที่มี บล็อก catch หลายอัน เนื่องจากไม่มีโค้ดซ้ำซ้อน
หมายเหตุ : หากcatch block จัดการ กับข้อยกเว้นมากกว่าหนึ่งประเภท พารามิเตอร์ catch ถือ เป็นขั้นสุดท้าย โดยปริยาย ในตัวอย่างนี้พารามิเตอร์catch exเป็นค่าสุดท้ายดังนั้นคุณจึงไม่สามารถกำหนดค่าใดๆ ให้กับพารามิเตอร์ภายในcatch block
วิธีการนี้มักใช้หากคุณพบข้อยกเว้นหลายรายการและมีรหัสที่คล้ายกัน แต่เราก็สามารถใช้ได้ตามต้องการเช่นกัน
ตัวอย่างที่ 2
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (ArithmeticException|ArrayIndexOutOfBoundsException e) {
if (e instanceof ArithmeticException)
System.out.println("ArithmeticException");
else
System.out.println("ArrayIndexOutOfBoundsException");
}
}
}
เมื่อตรวจพบข้อยกเว้นหลายข้อในบล็อกเดียวกฎจะถูกทำให้เป็นแบบเฉพาะเจาะจง
ซึ่งหมายความว่าหากมีลำดับชั้นของข้อยกเว้นในcatch block เราสามารถตรวจจับข้อยกเว้นพื้นฐานได้เท่านั้น แทนที่จะจับข้อยกเว้นพิเศษหลายรายการ
ลองมาเป็นตัวอย่าง
ตัวอย่างที่ 1: การจับคลาสยกเว้นฐานเท่านั้น
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
/ by zero
หากมีการระบุคลาสข้อยกเว้นพื้นฐานใน บล็อก catchห้ามใช้คลาสยกเว้นลูกในบล็อกcatch เดียวกัน มิฉะนั้นเราจะได้รับข้อผิดพลาดในการรวบรวม
ลองมาเป็นตัวอย่าง
ตัวอย่างที่ 2: คลาส Catching base และ child exception
class Main {
public static void main(String[] args) {
try {
int array[] = new int[10];
array[10] = 30 / 0;
} catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
โปรแกรม
ในบางกรณี โค้ดชิ้นเดียวอาจมีข้อยกเว้นมากกว่าหนึ่งข้อ เพื่อจัดการกับสถานการณ์ประเภทนี้ คุณสามารถระบุ catch clause สองข้อขึ้นไป โดยแต่ละข้อจับข้อยกเว้นประเภทต่างๆ เมื่อมีการโยนข้อยกเว้น แต่ละคำสั่ง catch จะถูกตรวจสอบตามลำดับ และคำสั่งแรกที่มีประเภทตรงกับข้อยกเว้นจะถูกดำเนินการ หลังจากคำสั่ง catch คำสั่งหนึ่งดำเนินการ คำสั่งอื่นๆ จะถูกข้ามไป และการดำเนินการจะดำเนินต่อไปหลังจากบล็อก try/catch ตัวอย่างต่อไปนี้ดักจับข้อยกเว้นที่แตกต่างกันสองประเภท:
// Demonstrate multiple catch statements.
class MultiCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index oob: " + e);
}
System.out.println("After try/catch blocks.");
}
}
นี่คือผลลัพธ์ที่เกิดจากการเรียกใช้ทั้งสองวิธี:
C:\>java MultiCatch
a = 0
Divide by 0: java.lang.ArithmeticException: / by zero
After try/catch blocks.
C:\>java MultiCatch TestArg
a = 1
Array index oob: java.lang.ArrayIndexOutOfBoundsException:42
After try/catch blocks.
/* This program contains an error.
A subclass must come before its superclass in
a series of catch statements. If not,
unreachable code will be created and a
compile-time error will result.
*/
class SuperSubCatch {
public static void main(String args[]) {
try {
int a = 0;
int b = 42 / a;
} catch(Exception e) {
System.out.println("Generic Exception catch.");
}
/* This catch is never reached because
ArithmeticException is a subclass of Exception. */
catch(ArithmeticException e) { // ERROR - unreachable
System.out.println("This is never reached.");
}
}
}
เข้าร่วมกลุ่ม Mouad Oumous Java WhatsApp เข้าร่วม
เข้าร่วม Mouad Oumous Telegram Channel เข้าร่วม
สัญญาณ | Java Concurrent API Java Concurrent API Packages — ตอนที่ 1 Java — 8 | BiFunction, BiConsumer และอินเทอร์เฟซ BiPredicate พร้อมตัวอย่าง




































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)