Java 中 throw 和 throws 的区别

2025年4月14日 | 阅读 7 分钟

throw 和 throws 是异常处理中的概念,其中 throw 关键字用于从方法或代码块中显式地抛出异常,而 throws 关键字则用于方法签名中。

throw 和 throws 关键字之间有很多区别。下面列出了 throw 和 throws 之间的区别:

序号。差异基础throwthrows
1.定义Java throw 关键字用于在代码中、函数内部或代码块中显式地抛出异常。Java throws 关键字用于方法签名中,以声明可能由函数在代码执行期间抛出的异常。
2.用途异常类型:使用 throw 关键字,我们只能传播非受检异常,即无法仅通过 throw 来传播受检异常。使用 throws 关键字,我们可以声明受检异常和非受检异常。但是,throws 关键字只能用于传播受检异常。
3.语法throw 关键字后跟一个要抛出的异常实例。throws 关键字后跟要抛出的异常类名。
4.声明throw 关键字用于方法内部。throws 关键字用于方法签名。
5.内部实现我们一次只能抛出一个异常,即我们不能抛出多个异常。我们可以使用 throws 关键字声明多个异常,这些异常可能由方法抛出。例如,main() throws IOException, SQLException。

Java throw 关键字

"throw" 关键字在 Java 中用于显式地抛出异常。它通过将控制权转移到可以处理被抛出异常的最近的 catch 块来中断程序的正常流程。当方法中发生异常时,该方法会创建一个异常对象并使用 "throw" 关键字将其抛出。

Java throw 示例

TestThrow.java

输出

Difference between throw and throws in Java

说明

Java 类 "TestThrow" 定义了一个名为 "checkNum()" 的方法,该方法接受一个整数参数。在此方法中,它检查输入数字是否小于 1。如果是,它会抛出一个 ArithmeticException,并附带一条消息,指示该数字为负数,其平方无法计算。否则,如果数字为正数或零,它将计算并打印该数字的平方。

在 main() 方法中,创建了 "TestThrow" 的一个实例,并使用一个负整数(-3)作为参数调用了 "checkNum()" 方法。由于输入数字为负数,该方法抛出了一个 ArithmeticException,而该异常未在 main 方法中捕获。因此,程序在打印异常消息后提前终止。因此,"Rest of the code."(剩余代码)语句未被执行。该代码说明了如何在满足特定条件时使用 "throw" 关键字显式地抛出 Java 异常,从而根据运行时条件控制程序流程。

Java throws 关键字

另一方面,"throws" 子句用于方法签名中,以指示该方法在其执行期间可能抛出某些类型的异常。它实际上并未抛出异常;相反,它声明该方法可能抛出指定类型的异常,从而提醒调用者进行适当处理。

Java throws 示例

TestThrows.java

输出

Difference between throw and throws in Java

说明

Java 类 "TestThrows" 定义了一个名为 "divideNum()" 的方法,该方法接受两个整数参数并返回第一个参数除以第二个参数的结果。该方法被声明为带有 "throws ArithmeticException" 子句,表明如果第二个参数为零,可能抛出 ArithmeticException,导致除零错误。

在 main() 方法中,创建了 "TestThrows" 的一个实例,并在 try 块中调用了 "divideNum()" 方法。如果在调用方法期间抛出了 ArithmeticException,则会被 catch 块捕获,该块将打印一条消息,指示不允许除零。

无论是否发生异常,程序都会继续执行剩余的代码,并在控制台打印 "Rest of the code."(剩余代码)。该代码演示了如何在方法签名中使用 "throws" 关键字指定潜在的异常,以及如何在 Java 中使用 try-catch 块处理这些异常。

Java throw 和 throws 示例

TestThrowAndThrows.java

输出

Difference between throw and throws in Java

说明

提供的 Java 代码定义了一个名为 "TestThrowAndThrows" 的类,其中包含一个名为 "method()" 的静态方法和 main 方法。"method()" 被声明为带有 "throws ArithmeticException" 子句,表明它在执行期间可能抛出 ArithmeticException。在 "method()" 中,会向控制台打印一条消息,然后显式地抛出一个 ArithmeticException。

在 main() 方法中,"method()" 在 try 块中被调用,并且在执行期间抛出的任何 ArithmeticException 都会被相应的 catch 块捕获。当代码执行时,首先从 "method()" 调用在控制台打印 "Inside the method()"。随后,正如预期的那样,ArithmeticException 被抛出并被 main 方法中的 catch 块捕获,导致打印消息 "caught in main() method"。此代码示例了如何在方法声明中使用 "throws" 关键字来指示潜在的异常,以及如何使用 try-catch 块在 Java 中处理这些异常。

结论

总之,理解 Java 中 "throw" 和 "throws" 之间的区别对于有效的异常处理至关重要。虽然这两个关键字在管理异常方面都起着重要作用,但它们服务的目的不同,并且在不同的上下文中被使用。"throw" 关键字用于在方法或代码块中显式地抛出异常,中断程序的正常流程并将控制权转移到最近的 catch 块。

另一方面,"throws" 关键字用于方法签名中,以声明方法在执行期间可能抛出的异常类型,从而为调用者提供一种适当处理潜在异常的机制。通过掌握 "throw" 和 "throws" 之间的细微差别,Java 开发人员可以通过实施量身定制的精确异常处理策略来增强代码的健壮性和可靠性,以满足其特定需求。


Java Throw 和 Throws 选择题

1. 关于 Java 中的 throw 关键字,以下哪个陈述是正确的?

  1. 它用于声明方法可能抛出的异常。
  2. 它用于在方法内处理异常。
  3. 它用于从方法或代码块中显式地抛出异常。
  4. 它用于捕获其他方法抛出的异常。
 

答案:c)

解释: throw 关键字用于在 Java 中手动从方法或代码块抛出异常。


2. 使用 Java 中的 throw 关键字可以抛出哪种类型的异常?

  1. 仅非受检异常。
  2. 仅受检异常。
  3. 受检异常和非受检异常都行。
  4. 仅自定义异常。
 

答案:a)

解释: throw 关键字可用于在 Java 中抛出受检异常和非受检异常,但主要用于传播非受检异常。


3. 在 Java 中,throws 关键字在哪里使用?

  1. 在方法内部声明要抛出的异常。
  2. 在 catch 块内部处理异常。
  3. 在 finally 块内部执行清理操作。
  4. 在 try 块内部监控代码的异常。
 

答案:a)

解释: throws 关键字用于方法签名中,以声明该方法可能抛出特定类型的异常。


4. 方法在其定义中可以使用 throw 和 throws 关键字吗?

  1. 可以,但仅当方法是静态的时。
  2. 可以,如果方法被声明为 final。
  3. 可以,但仅当方法在抽象类中定义时。
  4. 不可以,只能选择其中一个。
 

答案:d)

解释: 方法可以使用 throw 关键字抛出异常,或者使用 throws 关键字声明它可能抛出异常,但不能同时使用两者。


5. Java 中 throws 关键字的目的是什么?

  1. 捕获其他方法抛出的异常。
  2. 在方法内处理异常。
  3. 从方法中显式抛出异常。
  4. 声明方法可能抛出特定类型的异常。
 

答案:d)

解释: throws 关键字用于方法签名中,以声明该方法在其执行期间可能抛出特定类型的异常。