ความแตกต่างระหว่างการโยน VS. พ่นใน Java
เผยแพร่แล้ว: 2013-07-23คนหนึ่งประกาศ อีกคนทำ
มีคำหลักห้าคำที่เกี่ยวข้องกับการจัดการข้อยกเว้นใน Java เช่น try, catch, ในที่สุด, throw และ throws นอกเหนือจากความแตกต่างระหว่าง final, ultimate และ finalize , throw vs throws เป็นหนึ่งในคำถามสัมภาษณ์ Java ที่ถามบ่อย
- คีย์เวิร์ด throw ใช้เพื่อโยนข้อยกเว้นจากวิธีการใด ๆ หรือบล็อกสแตติกใน Java ในขณะที่ส่ง คีย์เวิร์ด ซึ่งใช้ในการประกาศเมธอด ระบุว่า ข้อยกเว้นใดที่เมธอดนี้สามารถส่งออกไปได้ พวกเขาไม่สามารถใช้แทนกันได้
- หากมีเมธอดใดส่งการตรวจสอบ Exception ตามที่แสดงในตัวอย่างด้านล่าง ผู้เรียกสามารถจัดการกับข้อยกเว้นนี้โดยจับมัน หรือสามารถโยนมันทิ้งอีกครั้งโดยการประกาศคำสั่งย่อยอื่นในการประกาศเมธอด
- คุณสามารถใช้ Throw clause ในส่วนใดก็ได้ของโค้ดที่คุณรู้สึกว่าต้องมีการยกเว้นเฉพาะในวิธีการเรียก
ทำความเข้าใจข้อยกเว้น Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
java . lang . Object | +-- java . lang . Throwable | +-- java . lang . Exception | | | +-- java . lang . ClassNotFoundException | | | +-- java . io . IOException | | | | | +-- java . io . FileNotFoundException | | | +-- java . lang . RuntimeException | | | +-- java . lang . NullPointerException | | | +-- java . lang . IndexOutOfBoundsException | | | +-- java . lang . ArrayIndexOutOfBoundsException | +-- java . lang . Error | +-- java . lang . VirtualMachineError | +-- java . lang . OutOfMemoryError |
หากเมธอดส่งข้อยกเว้น ควรล้อมรอบด้วย try catch block เพื่อดักจับ หรือเมธอดนั้นควรมีส่วนคำสั่ง throws ในลายเซ็น หากไม่มีคำสั่ง throws ในลายเซ็น คอมไพเลอร์ Java JVM จะไม่รู้ว่าต้องทำอย่างไรกับข้อยกเว้น คำสั่ง throws บอกคอมไพเลอร์ว่าข้อยกเว้นเฉพาะนี้จะได้รับการจัดการโดยวิธีการเรียก
ด้านล่างนี้เป็นตัวอย่างง่ายๆ ที่อธิบายพฤติกรรมของ Throw, Throws, Try, Catch, Last block ใน Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com . crunchify . tutorials ; import java . io . FileInputStream ; import java . io . FileNotFoundException ; /** * @author Crunchify.com */ public class CrunchifyThrowThrows { @SuppressWarnings ( "unused" ) public static void main ( String args [ ] ) throws Exception { FileInputStream crunchifyStream1 = null ; FileInputStream crunchifyStream2 = null ; String fileName = "Crunchify.txt" ; System . out . println ( "main: Starting " + CrunchifyThrowThrows . class . getName ( ) + " with file name = " + fileName ) ; // get file input stream 1 try { crunchifyStream1 = crunchifyTest1 ( fileName ) ; } catch ( FileNotFoundException ex ) { System . out . println ( "main: Oops, FileNotFoundException caught" ) ; } catch ( Exception ex ) { System . out . println ( "main: Oops, genreal exception caught" ) ; } // get file input stream 2 crunchifyStream2 = crunchifyTest2 ( fileName ) ; System . out . println ( "main: " + CrunchifyThrowThrows . class . getName ( ) + " ended" ) ; } public static FileInputStream crunchifyTest1 ( String fileName ) throws FileNotFoundException { FileInputStream crunchifyStream = new FileInputStream ( fileName ) ; System . out . println ( "crunchifyTest1: File input stream created" ) ; return crunchifyStream ; } public static FileInputStream crunchifyTest2 ( String fileName ) throws Exception { FileInputStream crunchifyStream = null ; try { crunchifyStream = new FileInputStream ( fileName ) ; } catch ( FileNotFoundException ex ) { throw new Exception ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; //System.out.println("crunchifyTest2: Oops, FileNotFoundException caught"); } finally { System . out . println ( "crunchifyTest2: finally block" ) ; } System . out . println ( "crunchifyTest2: Returning from crunchifyTest2" ) ; return crunchifyStream ; } } |
ผลลัพธ์:

1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : finally block Exception in thread "main" java . lang . Exception : crunchifyTest2 : Oops , FileNotFoundException caught at com . crunchify . tutorials . CrunchifyThrowThrows . crunchifyTest2 ( CrunchifyThrowThrows . java : 45 ) at com . crunchify . tutorials . CrunchifyThrowThrows . main ( CrunchifyThrowThrows . java : 30 ) |
ตอนนี้เพียงแค่แทนที่บรรทัด 45 และ 46 ด้วยบรรทัดด้านล่างเพื่อดูผลลัพธ์ด้านล่าง:
1 2 |
//throw new Exception("crunchifyTest2: Oops, FileNotFoundException caught"); System . out . println ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; |
ผลลัพธ์ใหม่:
1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : Oops , FileNotFoundException caught crunchifyTest2 : finally block crunchifyTest2 : Returning from crunchifyTest2 main : com . crunchify . tutorials . CrunchifyThrowThrows ended |
รายการ Java Tutorials ทั้งหมดที่คุณอาจสนใจ
เคล็ดลับโบนัสเกี่ยวกับข้อยกเว้น:
- การทำงานของโปรแกรมปกติจะแตกแขนงออกไปทันทีเมื่อมีการส่งข้อยกเว้น
- ข้อยกเว้นที่ตรวจสอบต้องถูกจับหรือส่งต่อ สิ่งนี้สามารถทำได้ในคำสั่ง try … catch หรือโดยการกำหนดข้อยกเว้นในนิยามเมธอด
- ข้อยกเว้นถูกจับโดยบล็อก catch แรกที่มีคลาสข้อยกเว้นที่เกี่ยวข้องตรงกับคลาสหรือซูเปอร์คลาสของข้อยกเว้นที่ส่ง
- หากไม่พบบล็อก catch ที่ตรงกันในห่วงโซ่ข้อยกเว้น เธรดที่มีข้อยกเว้นที่ส่งออกมาจะถูกยกเลิก
- บล็อก สุดท้าย หลังจากคำสั่ง try … catch ถูกดำเนินการโดยไม่คำนึงว่าจะมีการตรวจพบข้อยกเว้นหรือไม่
- การกลับมาภายในบล็อก สุดท้าย จะทำลายลูกโซ่ข้อยกเว้นไปยังผู้เรียกใช้ แม้จะไม่พบข้อยกเว้นก็ตาม