Java throw 异常

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

在 Java 中,throw 关键字用于在方法或代码块中显式地抛出一个异常。它允许开发人员发出信号,表明发生了错误并且需要处理。抛出的异常必须是 Throwable 的实例或其子类,例如 Exception 或 RuntimeException。

Java throw 关键字

Java throw 关键字用于从方法或代码块中显式地抛出异常。它可以用于抛出已检查异常和未检查异常。它主要用于抛出自定义异常。它为开发人员提供了一种在出现特定不期望的情况时手动触发异常的方法。

我们指定要抛出的异常对象。异常带有一个消息,提供错误描述。这些异常可能与用户输入、服务器、硬件故障、无效计算或许多其他情况相关,具体取决于程序的需要。

我们还可以定义自己的条件集,并使用 throw 关键字显式地抛出异常。例如,如果我们用另一个数除一个数,我们可以抛出一个 ArithmeticException。在这里,我们只需要设置条件并使用 throw 关键字抛出异常。

语法

其中 Instance 指的是一个类对象,该类对象必须扩展 Throwable(包括 Exception 类及其子类)。

让我们看一个抛出 IOException 的例子。

其中

  • new 用于创建异常类的实例(对象)。
  • 错误消息提供了有关异常原因的上下文。

其中 Instance 必须是 Throwable 类型或 Throwable 的子类型,例如,Exception 是 Throwable 的子类型,而用户定义的异常通常扩展 Exception 类。

关键要求

  • 我们抛出的对象必须是 Throwable 类型或其子类型之一。
  • 例如,Exception 是 Throwable 的子类型。
  • 用户定义的异常(也称为自定义异常)通常扩展 Exception 类。
  • 如果您在方法中抛出已检查异常但未处理,则必须使用 throws 关键字在方法签名中声明它。

为什么在 Java 中使用 throw?

手动抛出异常允许程序员:

  • 验证输入(例如,如果用户输入无效,则抛出异常)。
  • 处理特定情况(例如,如果找不到请求的资源,则抛出异常)。
  • 创建更具意义的错误消息,这些消息特定于应用程序的上下文。
  • 通过提供自定义错误信息来改进调试。

Java throw 关键字示例

示例 1:抛出未检查异常

在此示例中,我们创建了一个名为 validate() 的方法,该方法接受一个整数作为参数。如果年龄小于 18,我们抛出 ArithmeticException;否则,打印一条欢迎他们投票的消息。

实施

示例

编译并运行

输出

Exception in thread "main" java.lang.ArithmeticException: Person is not eligible to vote
	at Main.validate(Main.java:8)
	at Main.main(Main.java:17)

上面的代码抛出了一个未检查的异常。同样,我们也可以抛出未检查的异常和用户定义的异常。

注意:如果从方法中抛出未检查的异常,则不需要处理该异常或在 throws 子句中声明它。但是,对于已检查的异常,在 throws 子句中处理或声明是强制性的。

如果使用 throw 关键字抛出已检查异常,则必须使用 catch 块处理该异常,或者该方法必须在 throws 声明中使用它进行声明。

示例 2:抛出已检查异常

在 Java 中,已检查异常是编译器要求您使用 try-catch 块进行处理,或在方法签名中使用 throws 关键字进行声明的异常。这些异常通常来自外部源,例如文件操作、网络连接或数据库访问操作,这些操作容易出现故障。

与未检查异常(RuntimeException 的子类)不同,已检查异常是 Exception 的子类(但不是 RuntimeException 的子类)。

在此示例中,我们演示了如何使用 throw 关键字抛出已检查异常(FileNotFoundException),以及如何使用 try-catch 块对其进行正确处理。

注意:Error 和 RuntimeException 的每个子类在 Java 中都是未检查异常。已检查异常是 Throwable 类下的所有其他异常。

示例

编译并运行

输出

java.io.FileNotFoundException: C:\Users\Desktop\abc.txt (No such file or directory)
	at java.base/java.io.FileInputStream.open0(Native Method)
	at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:152)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:106)
	at java.base/java.io.FileReader.<init>(FileReader.java:60)
	at Main.method(Main.java:9)
	at Main.main(Main.java:20)

示例 3:抛出用户定义的异常

异常是 Throwable 类下的所有其他异常。Java 允许开发人员通过扩展 Exception 类或其子类之一来创建自己的自定义异常。这些被称为用户定义的异常。当您想强制执行 Java 内置异常未涵盖的特定于应用程序的规则和约束时,通常会使用它们。

在此示例中,我们将定义一个名为 UserDefinedException 的自定义异常,并使用 throw 关键字手动抛出它。我们还将使用 try-catch 块捕获和处理它,就像处理任何其他已检查异常一样。

示例

编译并运行

输出

Caught the exception
This is a user-defined exception

Java throw 关键字选择题

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

  1. 用于声明异常。
  2. 用于处理异常。
  3. 用于显式地抛出异常。
  4. 用于定义自定义异常。
 

答案:C

解释: Java 中的 throw 关键字用于从代码的任何部分显式地抛出异常,无论是已检查异常还是未检查异常。它不同于使用 try、catch 和 finally 进行的异常处理。


2. 当一个方法抛出已检查异常时,该方法必须声明什么?

  1. 它必须使用 throws 关键字声明该异常。
  2. 它必须在方法内捕获该异常。
  3. 它必须在方法内使用 try 块。
  4. 它必须忽略该异常。
 

答案:A

解释: 当一个方法抛出已检查异常时,它必须在其方法签名中使用 throws 关键字声明它抛出了该异常。它会告知方法的调用者,他们必须处理或进一步声明该异常。


3. 以下关于 Java 中自定义异常的说法,哪个是错误的?

  1. 自定义异常必须扩展 Exception 类。
  2. 自定义异常可以扩展 RuntimeException 类。
  3. 自定义异常不能有构造函数。
  4. 自定义异常可以包含其他方法和字段。
 

答案:C

解释: 这个陈述是错误的,因为自定义异常可以并且通常有构造函数。这些构造函数可用于在抛出异常时提供自定义错误消息或其他详细信息。


4. 考虑以下方法签名

关于 myMethod 声明,以下哪个说法是正确的?

  1. myMethod() 必须在方法内处理 IOException 和 SQLException。
  2. myMethod() 不能抛出任何异常。
  3. myMethod() 声明它可能会抛出 IOException 和 SQLException,并且这些必须由其调用者处理。
  4. myMethod() 只能抛出 IOException 而不能抛出 SQLException。
 

答案:C

解释: myMethod() 方法声明它可能会抛出 IOException 和 SQLException。myMethod() 的任何调用者都必须使用 try-catch 块处理这些异常,或在其自己的 throws 子句中声明它们。


5. 以下哪项正确描述了 finally 块在抛出异常时行为?

  1. finally 块仅在未抛出异常时执行。
  2. finally 块仅在抛出异常时执行。
  3. finally 块无论是否抛出异常都会执行。
  4. finally 块仅针对未检查异常执行。
 

答案:C

解释: finally 块始终执行,无论是否抛出异常。它通常用于资源清理,例如关闭文件或释放网络资源,确保这些操作在所有情况下都会发生。


下一主题Java 异常传播