什么是异常?
异常就是代表程序出现的问题,以异常对象告知程序员
异常体系:
异常类层次结构:
- 所有异常类都是
Throwable
类的子类。Throwable
有两个重要的子类:Error
和Exception
。Exception
又分为运行时异常和编译时异常。
Error:
代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sum公司会把这些问题封装成Error对象给出来,说白了,Error是给sum公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它
Exception:
叫异常,它代表的才是我们程序可能出现的问题,所以我们程序员通称会用exception以及它的孩子来封装程序出现的问题。
-
运行时异常:RuntimeException以及子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
-
编译时异常:编译阶段就会出现的错误提醒的(如:日期解析异常)
抛出异常:
在方法上使用throws关键字,可以将方法内部出现的异常跑出去给调用者处理
方法throws 异常1,异常2,异常3.....{
.......
}
public void someMethod() throws SomeException {
// 方法体可能抛出 SomeException 异常
}
捕获异常:(try...catch...)
try{
//监视可能出现异常的代码
}catch(异常类型1 变量){
//异常处理
}catch(异常类型2 变量){
//异常处理
}.......
try {
// 可能抛出异常的代码
} catch (ExceptionType e) {
// 处理异常
}
finally块:用于执行无论是否发生异常都需要执行的代码,比如资源释放。
try {
// 可能抛出异常的代码
} catch (ExceptionType e) {
// 处理异常
} finally {
// 无论是否发生异常都会执行的代码
}
自定义异常
异常有什么作用?
- 异常是用来查询系统bug的关键参考信息
- 异常可以作为方法内部得一种特殊返回值,以便通知上层调用者底层得执行情况
异常的处理:
- 捕获异常,记录异常并相应合适的信息给用户
- 捕获异常,尝试重新修复
案例:
假设一个除法计算器,允许用户输入两个数字,然后进行除法运算,处理一下用户可能输入的非数字值以及除数为零的情况
import java.util.InputMismatchException;
import java.util.Scanner;
public class DivisionCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("请输入被除数:");
int dividend = scanner.nextInt();
System.out.print("请输入除数:");
int divisor = scanner.nextInt();
double result = divide(dividend, divisor);
System.out.println("除法结果为:" + result);
} catch (InputMismatchException e) {
System.err.println("输入不是有效的数字!");
} catch (ArithmeticException e) {
System.err.println("除数不能为零!");
} finally {
scanner.close();
}
}
public static double divide(int dividend, int divisor) {
if (divisor == 0) {
throw new ArithmeticException("除数不能为零!");
}
return (double) dividend / divisor;
}
}