1. throwตัวดำเนินการ

เมื่อข้อยกเว้นถูกจับโดยcatchบล็อก และจนกว่าจะถูกส่งไปยังเครื่อง Java มันก็เป็นเพียงวัตถุที่สืบทอดมาException(หรือมากกว่านั้นThrowable) วัตถุยกเว้นเองไม่มีคุณสมบัติวิเศษใดๆ

ตรรกะทั้งหมดของวิธีการทำงานของข้อยกเว้นเป็นเพียงวิธีพิเศษที่เครื่อง Java ทำงานเมื่อมีข้อยกเว้นเกิดขึ้น

คุณสามารถสร้างข้อยกเว้นที่จับได้ใหม่ให้กับเครื่อง Java ได้เสมอ ในการทำเช่นนี้คุณต้องใช้throwตัวดำเนินการ:

throw exception;

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

ในโค้ดนี้ เราพบข้อยกเว้น แสดงข้อความเกี่ยวกับข้อยกเว้นนั้นบนหน้าจอ แล้วเขียนใหม่อีกครั้ง

catchบล็อกอื่นในtryบล็อก เดียวกัน ไม่สามารถจับข้อยกเว้นที่ถูกโยนใหม่ได้


2. ข้อยกเว้นของคุณ

ยังไงก็ตาม คุณสามารถสร้างวัตถุยกเว้นได้ด้วยตัวคุณเอง: มันเป็นเพียงวัตถุที่มีประเภทExceptionหรือคลาสที่สืบทอดมา และโยนมัน

มันง่ายกว่าที่คิด ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

ในตัวอย่างข้างต้น เราสร้างวัตถุยกเว้นใหม่ที่มีประเภทRuntimeExceptionและโยนทิ้งทันทีโดยใช้throwตัวดำเนินการ

จะถูกบล็อกทันทีcatchเนื่องจาก RuntimeException สืบทอดExceptionมา รหัสcatch (Exception except)จับวัตถุยกเว้นของทุกชั้นที่สืบทอดExceptionชั้น



3. finallyคำหลัก

อีกจุดสำคัญ บางครั้งโปรแกรมเมอร์จำเป็นต้องดำเนินการบางอย่างโดยไม่คำนึงว่าจะมีข้อยกเว้นเกิดขึ้นในรหัสหรือไม่ ตัวอย่างเช่น สมมติว่าเราเปิดไฟล์สำหรับเขียน ไฟล์ที่เปิดจะต้องปิดโดยการโทรclose()

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

ในการดำเนินการบังคับเหล่านี้ บล็อกชนิดอื่น ( finally) ถูกเพิ่มเข้าไปในtry-catchโครงสร้าง ดังนั้นการสร้างtry-catch-finallyโครงสร้าง ดูเหมือนว่า:

ตัวอย่าง:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

รหัสในfinallyบล็อก จะดำเนินการในกรณีใด ๆ โดยไม่คำนึงว่าจะมีข้อยกเว้นหรือไม่ แม้ว่าข้อยกเว้นจะถูกส่งออกไปและไม่ถูกตรวจจับfinallyบล็อกจะยังคงดำเนินการอยู่

อย่างไรก็ตาม หากคุณไม่ต้องการตรวจจับข้อยกเว้น แต่คุณต้องการบล็อก ให้finallyใช้เครื่องหมายชวเลขสำหรับtry-catch-finallyโครงสร้าง: a try-finallyblock ดูเหมือนว่า:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}