投掷与投掷有什么区别。 抛出 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块内返回也会中断调用者的异常链。