异常(exception)是程序运行过程中出现的非正常情况。异常不一定意味着程序必须崩溃;如果提前设计好处理方式,程序可以给出提示、记录问题,或者继续执行后续逻辑。
常见异常
异常类型会说明失败的类别:
NumberFormatException值不符合要求,例如把 "3.6" 转成 int。
ArithmeticException整数除法的除数为 0。
ArrayIndexOutOfBoundsException数组下标越界。
NullPointerException通过 null 访问成员。
FileNotFoundException打开不存在的文件。
IllegalArgumentException参数不符合方法要求。
异常不应该代替普通条件判断。简单规则通常先用 if;异常更适合处理运行到某一步才知道是否会失败的情况。
知识测验
题目
除数为 0 通常触发哪个异常?
try、catch 与 finally
try 放可能失败的操作;异常一旦产生,try 中剩余语句会被跳过。Java 寻找匹配的 catch,把异常交给处理代码。try 中风险操作后面的语句构成成功路径,只有前面没有抛出异常时才会运行;无论哪条路径,finally 都负责收尾。
互动实验
异常路径调试器:从风险代码到安全收尾
访问权限免费
选择一次输入并单步运行。左侧高亮下一行,右侧同步显示变量、异常对象和控制流。
JAVA● DEBUG
01try {02 result = Integer.parseInt(a) / Integer.parseInt(b);03 message = String.valueOf(result);04 success = true;05} catch (ArithmeticException | NumberFormatException exception) {06 message = exception.getClass().getSimpleName();07} finally {08 cleaned = true;09}
a21
b4
result—
exception—
cleanedfalse
1/6 · tryimport java.util.Scanner;
Scanner scanner = new Scanner(System.in);
try {
System.out.print("Enter dividend: ");
int dividend = Integer.parseInt(scanner.nextLine());
System.out.print("Enter divisor: ");
int divisor = Integer.parseInt(scanner.nextLine());
int quotient = dividend / divisor;
System.out.println("Result: " + quotient);
} catch (NumberFormatException exception) {
System.out.println("Only integers are supported.");
} catch (ArithmeticException exception) {
System.out.println("Divisor cannot be 0.");
} finally {
System.out.println("This calculation is finished.");
}知识测验
题目
try 没有抛出异常时,Java 的成功路径语句应放在哪里?
捕获具体异常
不要一开始就写过宽的 catch (Exception exception)。如果什么异常都捕获,程序可能把真正的 bug 也吞掉。只捕获当前操作预期的失败,错误原因和处理动作会更明确。
try {
int score = Integer.parseInt(text);
} catch (NumberFormatException exception) {
System.out.println("Score must be an integer.");
}知识测验
题目
为什么应该优先捕获预期的具体异常?
主动抛出异常:throw
throw 让方法主动报告输入违反了自己的要求。方法负责发现问题,调用者负责决定怎样提示、重试或记录。
static double normalizeScore(int score) {
if (score < 0 || score > 100) {
throw new IllegalArgumentException("Score must be between 0 and 100.");
}
return score / 100.0;
}
try {
double ratio = normalizeScore(120);
} catch (IllegalArgumentException exception) {
System.out.println("Invalid input: " + exception.getMessage());
}动手练习
安全地创建 Circle 对象
- Circle 构造方法在半径为负数时主动抛出 IllegalArgumentException。
- 主程序在 try 中把输入转换成 float 并创建对象。
- 分别捕获无效数字和负半径产生的 IllegalArgumentException,并打印异常信息。
- 增加 finally,始终打印“检查结束”。