异常处理
1、下标越界
2、空指针
3、类型转换异常
4、数字格式化
5、数学异常
编程界:
1、除数为0
2、IO流,没有关闭
3、停电
当一个程序抛出一个异常时,抛异常后面的语句,不再执行,类似于return的功能,终止方法的执行
try catch解决异常,
public class Ch01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
// try catch解决异常
try {
// 把有可能 抛异常的代码放到try语句块里
System.out.println(num1 / num2);
}catch (Exception e){
System.out.println("除数不能为0");
e.printStackTrace();
}
System.out.println("我很重要....");
}
}
异常的继承体系结构
最顶级的Throwable,错误,异常
Error:正常情况下,不太可能出现的,绝大多数Error都会导致程序处于非正常的状态下,很难恢 复,外力的作用下,不考虑。Error是Throwable的子类,他是在java程序处理范围之外的
Exception:java语言中,将程序执行中发生非不正常的情况称为异常。Exception也是Throwable的子类。
编译期异常:写代码的时候,抛异常。如果编译器不解决,会编译不通过,一直报错
/编译期异常
public class MyException extends Exception {
// 有参构造器
public MyException(String message) {
super(message);
}
}
在一个语句块中,如果使用throw抛出一个编译期异常,就必须在方法的声明处使用throws关键字来标记异常类型
public void fun(int i, int j) throws MyException {
}
运行期异常:RuntimeException,运行时会抛异常,平时没事
/**
* 运行期异常
*/
public class MyRuntimeException extends RuntimeException{
public MyRuntimeException(String message) {
super(message);
}
}
自定义异常:
Java中异常机制虽然很完善,但是结合实际业务还差很多。
年龄出现负数需要自定义异常、电商搜索乱码需要自定义异常
自定义异常方式:
1.所有异常必须是Throwable的子类(大材小用,没必要)
2.如果要定义一个编译期异常,需要继承exception类
3,如果定义一个运行期异常,需要继承RuntimeException
还有一种处理方式,就是直接try...catch。只要说解决异常,就用try...catch
我们为什么要手动抛异常?
因为要配合全局异常处理机制来处理
throw语句是可以当做方法的返回值的
在一个有返回值的方法中,如果有条件
异常链:
一个异常如果被抛出去之后会继续被调用这个方法的方法捕获或抛出异常会扩展
只要说解决异常、处理异常、捕获异常就是try ... catch
throws
如果一个方法没有捕获一个编译期异常,该方法必须使用throws来声明
throws并不是真正的解决了异常,只是把异常抛给了下一级调用者
(1)在方法里直接try ... catch解决
(2)在方法里抛异常给主函数,在主函数里try ... catch解决
面试题:
throws和throw区别
throws出现在什么地方?
方法的声明处,抛出多个异常,用,隔开
finally关键字
finally用来创建try代码块后面执行的代码块
无论是否发生异常,finally代码块中的代码一定会执行。一般finally中的代码都是用来释放资源的。
try...catch...finally执行顺序
finally永远是最后走的
catch可以写多个,但是先写小的,后写大的
方法的重写
重写的不能方法不能抛出比重写方法更大的异常类型