在 Java 中,异常处理是我们处理运行时错误的有效手段之一,目的是保证应用程序的正常流程。它可以处理诸如 INLINECODE8bc3f5bd(空指针异常)、INLINECODE3d108f66(数组下标越界异常)等运行时错误。为了有效地处理这些错误,Java 为我们提供了两个关键字:INLINECODE519addb3 和 INLINECODEf58e223e。
Java throw
Java 中的 INLINECODE953d44c4 关键字用于从方法或任何代码块中显式地抛出一个异常。我们可以抛出受检异常或非受检异常。INLINECODEbe3ec726 关键字主要用于抛出自定义异常。
语法:
> throw Instance
其中,instance 是 INLINECODEd0618f2a 类型(或其子类,如 INLINECODE59506b95)的对象。
示例:
> throw new ArithmeticException("/ by zero");
但是,这个异常(即 Instance)必须是 Throwable 类型或其子类。
当 throw 语句被执行后,程序的执行流程会立即停止,并检查最近的封闭 try 块,看它是否有与该异常类型匹配的 catch 语句。如果找到匹配项,控制权将转移到该语句;否则,继续检查下一个封闭的 try 块,以此类推。如果找不到匹配的 catch 块,默认的异常处理器将中止程序。
示例: 这个例子演示了如何在方法内部抛出、捕获并重新抛出一个异常。
Java
CODEBLOCK_0cc4c071
Output
Caught inside fun().
Caught in main.
说明: 上面的例子演示了如何使用 INLINECODEb746a056 关键字显式抛出 INLINECODE45a714ed。该异常在 fun() 方法内部被捕获并重新抛出,随后在 main() 方法中被捕获。
示例: 这个例子演示了一个算术异常。
Java
CODEBLOCK_53e38125
输出:
Hangup (SIGHUP)
Exception in thread "main" java.lang.ArithmeticException: Cannot divide by zero
at Geeks.main(Geeks.java:9)
说明: 上面的例子演示了使用 INLINECODEa4f9e8da 产生异常的情况,这里因为除以零而显式抛出了 INLINECODE3914513d。
Java throws
throws 是 Java 中的一个关键字,用在方法签名中,用于指示该方法可能会抛出列出的某种类型的异常。这些方法的调用者必须使用 try-catch 块来处理该异常。
语法:
> type methodname(parameters) throws exceptionlist
其中,exception_list 是该方法可能抛出的所有异常的逗号分隔列表。
在程序中,如果存在引发异常的可能性,编译器总是会警告我们,我们必须处理那个受检异常,否则,我们将遇到编译时错误,提示“未报告的异常 XXX 必须被捕获或声明被抛出”。为了防止这种编译时错误,我们可以通过两种方式处理异常:
- 通过使用 try catch
- 通过使用 throws 关键字
我们可以使用 throws 关键字将异常处理的责任委托给调用者(它可能是一个方法或 JVM),然后由调用者方法负责处理该异常。
示例 1:未处理的异常
Java
CODEBLOCK_fad45e07
输出:
error: unreported exception InterruptedException; must be caught or declared to be thrown
说明: 在上面的程序中,我们遇到了编译时错误,因为如果主线程进入休眠,其他线程获得机会执行 INLINECODE5d414cea 方法可能会导致 INLINECODEe138bf39。
示例 2:使用 **throws** 来处理异常
Java
CODEBLOCK_876cce2b
输出:
Hello Geeks
说明: 在这个例子中,我们在 INLINECODEc2904230 方法签名中使用了 INLINECODE505bc520。这意味着我们将处理 InterruptedException 的责任交给了调用者(在这里是 JVM)。现在程序可以成功编译并打印出输出。