深入理解 Java 中的 throw 和 throws

在 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)。现在程序可以成功编译并打印出输出。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/42580.html
点赞
0.00 平均评分 (0% 分数) - 0