异常分类
异常:程序不正常的行为或者状态
int a = 5/0;
数组越界访问
读取文件,结果该文件不存在
异常处理:
- 程序返回到安全状态 允许用户保存结果,并以适当方式关闭程序
Throwable:所有错误的祖先
Error:系统内部错误或者资源耗尽
Exception:程序有关的异常
- RuntimeException:程序自身错误
5/0,空指针,数组越界 - 非RuntimeException:外界相关错误
打开一个不存在文件
加载一个不存在的类
Unchecked Exception:(编译器不会辅助检查的,需要程序员自己管)
Checked Exception(非RuntimeException):(编译器会辅助检查的)
异常处理
- 允许用户及时保存结果
- 抓住异常,分析异常内容
- 控制程序返回到安全状态
try-catch-finally: 一种保护代码正常运行的机制
结构:
try//正常业务逻辑代码
catch//当try发生异常,将执行catch代码,若无异常,跳过
catch
catch
finally//当try或者catch执行结束后,必须要执行finally
//try必须有,cathch、finally至少有一个
一个异常只能进入一个catch块
catch块的异常匹配时从上而下进行匹配的
小异常在前,大异常在后
try结构中,如果有finally块,finally 肯定会被执行
try-catch-finally每个模块里面也会发生异常,所有可以在内部继续写一个完整的try结构
使用throws来声明异常——不处理
调用带有throws异常(checked exception)的方法,要么处理这些异常,或者再次向外throws,直到main函数为止
public int divide(int x, int y) throws ArithmeticException
{
int result = x/y;
return x/y/
}
//未声明除数不为0, 可能发生异常,直接throws,此时main函数仍然可以执行。
//如果调用有异常的程序而不声明,则main函数无法执行。
- 一个方法如果被覆盖,那么覆盖它的方法必须抛出相同的异常,或者异常的子类
- 如果父类的方法抛出多个异常,那么重写的子类方法必须抛出那些异常的子集,也就是不能抛出新的异常,也就是说重写方法时,子类方法抛出的异常不能超过父类方法的异常范围
自定义异常
-
自定义异常,需要继承Exception类或其子类
继承自Exception,就变成Checked Exception
继承自RuntimeException,就变成Unchecked Exceptio -
自定义重点在构造函数
调用父类Exception的message构造函数
可以自定义自己的成员变量 -
在程序中采用throw主动抛出异常
public static void testException() throws MyException {
throw new MyException();
}
//在方法内部程序中,抛出异常采用throw关键字,在方法头部声明中,声明异常采用throws关键字