在Java的异常处理体系中,throw关键字用于主动在代码中抛出一个具体的异常实例,让程序在出现异常场景时按照预设的异常逻辑进行处理。下面我们结合具体场景和代码示例,详细了解它的使用方法。

throw关键字的基本作用
throw关键字的核心作用是在程序执行到特定逻辑时,主动触发一个异常对象,中断当前代码的执行流程,将异常抛给上层调用者或者最近的异常捕获模块。它和throws关键字不同,throws是用于方法声明上标注可能抛出的异常类型,而throw是直接抛出具体的异常实例。
throw的基本语法格式
使用throw抛出异常的语法非常简单,格式如下:
throw new 异常类型(异常信息);
其中异常类型可以是Java内置的异常类,比如NullPointerException、IllegalArgumentException,也可以是开发者自定义的异常类,异常信息则是用来描述异常原因的字符串,方便后续排查问题。
throw使用场景与代码示例
场景1:抛出内置运行时异常
当方法接收的参数不符合预期时,我们可以主动抛出运行时异常,不需要在方法声明上用throws标注,因为运行时异常属于非受检异常。
public class ThrowDemo {
// 计算两个整数相除的结果,除数不能为0
public static int divide(int a, int b) {
if (b == 0) {
// 主动抛出算术异常,告知除数不能为0
throw new ArithmeticException("除数不能为0,请检查输入参数");
}
return a / b;
}
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("计算结果:" + result);
} catch (ArithmeticException e) {
System.out.println("捕获到异常:" + e.getMessage());
}
}
}场景2:抛出受检异常
如果抛出的是受检异常(比如IOException、SQLException等),那么要么在方法内部用try-catch捕获处理,要么在方法声明上用throws标注该异常,交给上层调用者处理。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ThrowCheckedDemo {
// 读取指定路径的文件,抛出受检异常
public static void readFile(String filePath) throws FileNotFoundException {
File file = new File(filePath);
if (!file.exists()) {
// 主动抛出文件未找到的受检异常
throw new FileNotFoundException("指定路径的文件不存在:" + filePath);
}
// 后续文件读取逻辑
new FileInputStream(file);
}
public static void main(String[] args) {
try {
readFile("D:/test.txt");
} catch (FileNotFoundException e) {
System.out.println("文件读取异常:" + e.getMessage());
}
}
}场景3:抛出自定义异常
当内置异常无法满足业务场景的异常描述需求时,我们可以自定义异常类,然后用throw抛出自定义异常实例。
// 自定义业务异常类,继承Exception(受检异常)或者RuntimeException(非受检异常)
class BusinessException extends Exception {
public BusinessException(String message) {
super(message);
}
}
public class CustomThrowDemo {
// 用户年龄校验方法,年龄必须在1-120之间
public static void checkAge(int age) throws BusinessException {
if (age < 1 || age > 120) {
// 抛出自定义业务异常
throw new BusinessException("用户年龄不符合规范,年龄范围应为1-120,当前输入:" + age);
}
System.out.println("年龄校验通过,年龄为:" + age);
}
public static void main(String[] args) {
try {
checkAge(150);
} catch (BusinessException e) {
System.out.println("业务异常:" + e.getMessage());
}
}
}使用throw的注意事项
- throw后面必须跟一个可抛出的异常对象,也就是Throwable类或者其子类的实例,不能直接跟字符串或者其他类型的对象。
- 一旦执行到throw语句,当前方法的后续代码将不再执行,程序会直接跳转到异常捕获或者上层调用者的异常处理逻辑中。
- 如果抛出的是受检异常,必须处理该异常,要么用try-catch捕获,要么用throws在方法声明上抛出,否则代码会编译报错。
- 不建议滥用throw抛出运行时异常,应该优先使用合适的异常类型,并且异常信息要清晰明确,方便问题排查。