投擲與投擲有什麼區別。 拋出 Java
已發表: 2013-07-23一個聲明,另一個做
Java 中有五個與異常處理相關的關鍵字,例如try、catch、finally、throw 和 throws 。 除了final、finally 和 finalize之間的區別之外, throw 與 throws 是 Java 面試中經常被問到的問題之一。
- throw 關鍵字用於從 Java 中的任何方法或靜態塊中拋出異常,而throws 關鍵字用於方法聲明,表示該方法可能拋出的異常。 它們不可互換。
- 如果任何方法拋出如下示例所示的已檢查異常,則調用者可以通過捕獲它來處理此異常,也可以通過在方法聲明中聲明另一個 throws 子句來重新拋出它。
- Throw 子句可用於您認為需要向調用方法拋出特定異常的任何代碼部分。
了解 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 塊包圍以捕獲它,或者該方法應該在其簽名中包含 throws 子句。 如果簽名中沒有 throws 子句,Java JVM 編譯器不知道如何處理異常。 throws 子句告訴編譯器這個特定的異常將由調用方法處理。
下面是一個非常簡單的示例,它解釋了 Java 中 Throw、Throws、Try、Catch、Finally 塊的行為。
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 教程的列表。
關於例外的額外提示:
- 當拋出異常時,正常的程序執行會立即分支。
- 必須捕獲或轉發已檢查的異常。 這可以在try ... catch語句中或通過在方法定義中定義異常來完成。
- 異常由關聯異常類與拋出異常的類或超類匹配的第一個catch塊捕獲。
- 如果在異常鏈中沒有找到匹配的catch塊,則終止包含拋出異常的線程。
- 無論是否捕獲到異常,都會執行try ... catch語句之後的finally塊。
- 即使對於未捕獲的異常,在finally塊內返回也會中斷調用者的異常鏈。