异常的处理
异常的概念
异常指的是运行期间出现的错误,程序开始执行,在执行期内出现的问题。出现了异常过后我们要关注异常的类型 、 异常出现的行号。
在java中,java的异常时java提供的用与处理程序错的一种机制。
错误值得是在程序运行过程中发生的一系列异常事件,比如下标越界、空指针、除数为0
异常处理机制:一旦异常发生过后,使用异常处理机制让程序不会直接中断或者影响虚拟机运行
1
2
3
4
异常的分类
1、Error:称为错误(不是异常)、java虚拟机生成并抛出,虚拟机加错误、动态链接失败之类的等等、程序控制不了、用户也无法控制。jvm的运行环境问题
2、Exceptinon:用户的错误、或者程序无法预见的一些问题。所有异常的f父类、很多个子类,每一个子类都对应到异常情况。一旦出现exception这种异常,需要开发者自己去处理(捕获)
3、Runtime Exception:运行时异常是程序在运行过长中发生的可以被程序员避免的异常。如果你不处理,抛出异常后提示开发要关注
常见的异常:
ClassNotFoundException
IOException
SQL Exception
NoSuchFieldException
RuntimeException
ClassCastException
NullPointerException
UnknownTypeException
IndexOutOfBoundsException
ArithmeticException /算术异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
在开发过程中的异常先不去处理
异常的执行流程
在方法执行过程中,方法押入到方法栈中,在某一个方法中出现了运行时异常,没有处理这种异常,后边方法的内容无法执行,异常抛给了虚拟机,中断了虚拟机继续运行
方法栈:方法在调用的过程中,先执行的方法后退出
运行流程:
1、main在栈的最底部,method2栈的最顶部,method2抛出一个异常,method2从栈中取出来
2、将异常抛给method1,method1并没有处理这个异常,将异常抛给main方法。此刻method移除栈
3、main方法接收到method1抛出来的异常,main也没有处理这个异常,当前这个异常就会抛给虚拟机,虚拟机就会创建一个异常对象。识别异常分类,直接将异常信息打印到控制台,结束程序。
1
2
3
4
5
6
异常的结构体系
throwable 所有异常的根基类,也可以抛出
Error:表示错误,开发过程中程序无法去控制和处理
Exception:表示异常,开发过程中,可以去进行处理
RuntimeException
SQL Exception
Exception:
检查异常:编译器要求你必须要处理的异常,不处理程序无法运行。当你代码没有运行的时候,编译器就检查出来的问题。
非检查异常:编译器不强制要求处理的异常。虽然在运行中有可能出问题,但是不要求你处理(ClassCastException
NullPointerException)
1
2
3
4
5
6
7
8
9
10
异常的基本用法
捕获异常
语法1:
try{
运行过程中要执行的逻辑代码,这段代码可能会出现问题,捕获异常
}catch(Exception e){//声明一个父类异常,接受一个异常
//提示当前系统出现了什么样的异常
e.printStackTrace();//打印错误信息
}
1
2
3
4
5
6
语法2:
try{
}catch(Exception e){
}catch(Exception e){
}
1
2
3
4
5
语法3 :
try{
}catch(Exception e){
}catch(Exception e){
}finally {
}
1
2
3
4
5
6
7
1、finally 为异常提供了一个统一的出口,使得当前程序在跳转到另外程序的流程之前,能够对程序进行统一的管理。
2、无论try模块中的内r容是否执行,finally代码都执行一次
3、通常我们在fianlly里面要执行的内容是资源的关闭,或者日志的记录
语法4:
try{
}fianaly{
}
1
2
3
申明并抛出异常
在本方法中、如果出现了异常,本方法可以不进行处理,抛给调用者来处理。
将异常一层一层往外抛,在达到虚拟机之前处理好整个程序运行流程不受影响。
throw:将异常进行抛出(动作)
throws:声明将要抛出何种类型的异常(声明)
在catch 方法块中 throw new 异常类型() ,在本方法后面加上 throws 异常类型,表示向上一层抛出,用了throw之后,如果try里面的代码块有异常 ,后面的代码就不会再执行了
重写方法的时候,子类和父类异常问题
1、父类方法没有抛出异常、而子类重写的方法抛出了异常,是不被允许的。编译都通过不了
2、父类抛出了异常,子类重写方法抛出跟父类同样的异常,没有问题
3、父类抛出异常,子类重写方法不抛出异常,编译器能编译通过,不推荐这样写。
4、父类抛出一个Exception,子类可以抛出比Exception小的异常,子类的异常不能比父类的异常大
5、父类抛出异常小于子类的异常,不行,编译报错
6、父类抛出一个Exception。子类抛出多个字异常,编译 通过
自定义异常
输入的年龄大于100岁,性别选择中性
好处:
在团队开发过程中,都是分模块、分功能进行开发的,在项目找那个统一制定自己的异常,对外统一显示内容。
1、在用户发请求进行数据验证的时候,如果数据验证失败,自己抛出自定义异常
2、在开发过程中,遇到某些逻辑上面的问题,判断性别出现中性的时候。java没有提供性别中性异常,自定义
3、系统提供的异常,如果直接给用户,体验不是特别好,包括异常的信息,代码。代码中能抛出去的 异常,用户处理过的异常
1、不管自定义异常还是系统提供的异常,都必须是Throwable的子类
2、写一个检查性的异常,需要写一个类继承Exception
3、写一个运行时异常,需要写一个类继承RuntimeException
---------------------
原文地址:https://www.cnblogs.com/ly570/p/11102425.html