原文: https://howtodoinjava.com/java/exception-handling/throw-vs-throws/

在 Java 异常处理中,throw关键字用于显式抛出方法或构造器中的异常。throws`关键字**用于声明该方法或构造器可能抛出的异常列表。

1. Java throw关键字

1.1 语法

要从方法或构造器引发异常,请使用throw关键字以及异常类的实例。

  1. public void method()
  2. {
  3. //throwing an exception
  4. throw new SomeException("message");
  5. }

1.2 处理受检与非受检异常

如果我们从方法中抛出非受检的异常,则处理该异常或在throws子句中声明不是强制性的。 例如,NullPointerException是非受检的异常。

  1. public class JavaExample
  2. {
  3. public static void main(String[] args)
  4. {
  5. method();
  6. }
  7. public static void method( ) {
  8. throw new NullPointerException();
  9. }
  10. }

但是,如果我们使用throw语句抛出受检异常,则必须在catch块**中处理该异常,或者必须使用throws声明显式地声明该方法。 例如,FileNotFoundException是受检异常。

  1. public class JavaExample
  2. {
  3. public static void main(String[] args)
  4. {
  5. try
  6. {
  7. method();
  8. }
  9. catch (FileNotFoundException e)
  10. {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static void method( ) throws FileNotFoundException
  15. {
  16. throw new FileNotFoundException();
  17. }
  18. }

在 Java 中,ErrorRuntimeException的每个子类都是非受检的异常。 一个受检的异常是Throwable类下的所有其他内容。

1.3 异常传播

在调用栈中,异常会在方法与方法之间传播,直到被捕获为止。 因此,如果a()调用b(),然后调用c(),又调用d(),并且如果d()抛出异常,则该异常将从d传播到cb传播到a,除非这些方法之一捕获异常。

如上所述,对异常处理程序的搜索从发生错误的方法开始,然后以与调用方法相反的顺序在调用栈中进行。

找到合适的处理程序(catch)后,运行时系统会将异常传递给处理程序。 如果未找到异常处理程序,则异常到达 JVM 的默认异常处理程序,该程序将异常详细信息打印到日志并终止应用程序。

2. Java throws关键字

Java throws关键字用于声明方法执行期间可能发生的异常列表。

2.1 语法

要声明异常列表,请使用throws关键字以及异常类名称。

  1. public static void method( ) throws FileNotFoundException, ConnectionException {
  2. //code
  3. }

2.2 可以抛出受检和非受检的异常

我们可以使用throws子句声明两种类型的异常,即受检和非受检的异常。 但是调用给定方法必须仅处理受检异常。 非受检异常的处理是可选的。

  1. public class JavaExample
  2. {
  3. public static void main(String[] args)
  4. {
  5. try
  6. {
  7. //Can skip handling of NullPointerException (unchecked exception)
  8. method();
  9. }
  10. catch (FileNotFoundException e)
  11. {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static void method( ) throws NullPointerException, FileNotFoundException {
  16. //code
  17. }
  18. }

3. Java 中throwthrows之间的区别

  1. throw关键字用于从任何方法或构造器中显式抛出单个异常,而throws关键字用于方法和构造器声明中,表示该方法可能引发该异常。
  2. throw后跟异常类的实例,而throws后跟异常类的名称。
  3. throw用于方法和构造器,其中throws与方法和构造器签名一起使用。
  4. 我们可以使用throw仅抛出单个异常,但是可以使用throws声明多个异常,其中之一可以通过方法抛出也可以不通过方法抛出。
  5. 受检的异常将传播到调用方方法,而非受检的异常将不会传播,因此可能不需要显式的异常处理。
  6. 使用throw关键字,我们还可以中断switch语句或循环,而无需使用break关键字,使用throws无法执行它。

学习愉快!