常见运行的异常
NullPointerException 说明空指针异常
ArraylndexOutOfBoundsException 数组越界异常
ClassCastException 类型转换异常
NumberFormatException 数字格式化异常
ArithmeticException 算术异常
- 正常请求
程序没有问题,从头执行到尾。
- 出现异常并处理(与catch提供的异常处理匹配有相匹配的处理方式)
try 执行可能出现异常的代码,这时发现代码异常,不再执行try里面代码发生异常后的代码,会直接进行catch 捕捉,并处理(执行catch里面的代码),然后继续执行try catch之后的代码。
- 异常不匹配(catch捕获的异常与catch提供解决的异常不匹配)
try进行可能出现异常的代码,此时发生代码异常,立即catch进行捕获,发现与catch提供的异常处理不匹配,此时代码运行中断,之后的所有操作不再执行(try里面发生异常之后的代码和catch里面的代码以及try catch以后的代码都不进行运行)。
理解:
try catch 跟之前一样,此处增加finally ,只需要理解它就行。
finally怎么理解它是否发生异常都会执行呢?作用是什么呢?
- 如果没有发生异常,意味着catch不会捕获且不会执行catch里面的代码。但是会执行finally里面的代码,再执行try catch finally之后的代码。
- 如果发生异常并且被catch捕获,意味着try发生异常之后的代码不执行,但是catch捕获异常后,catch里面的代码以及finally里面的代码,还有try catch finally之后的代码都会执行。
- 如果发生异常并且没有catch捕获,不仅不执行try发生异常后的代码,而且catch代码也不执行。但是finally里面的代码执行。 注意:try catch finally 之后的代码也不执行。
- finally的作用就是释放资源。
小总结:
注意:catch捕获就是要进行catch里面的代码,反之不进行
try异常无finally,有catch且捕获,程序行;
try异常有finally,有catch且捕获,finally、程序行。
try异常有finally,有catch没捕获,finally行。
try正常有finally,有catch不管他,finally、程序行。
其实就一句话,有finally加finally程序代码,有捕获就执行除过try异常后的代码,都执行。没捕获直接拜拜。
跟switch() case 函数 很像
try发现异常依次catch捕获,只要有一个捕获到了,后面的就不进行了,以后情况就跟try catch情况没有区别了。
注意:上层catch不能比下层catch处理异常的范围大,要不要下面有什么用呢?你说呢?
try发现异常了,由于finally只执行但是不会处理异常,这时候谁调用try finally这个函数(try finally在这个函数里面),谁就来处理这个异常(当调用函数没有抛出异常的情况下,如果抛出它想处理就处理,运用throws,后面会讲到)。但要记住,最上层必须处理,否则中断。
一个函数不管又没有异常,它都声明异常(声明多个也没事),谁调用它就处理它的异常,除非调用的函数也同样做此操作,声明异常。一般不会这样,这有什么意义呢?处理操作就是try catch finally,有无finally都可以,把调用函数放try里面让catch捕获异常并处理。
在函数体里面,用throw抛出异常 然后处理
自己定一个异常类,具体方法就是,catch捕获的异常类是你自定义的,你自己怎么定义呢?你用自己定义的异常类继承一个父类,父类是jvm里面自带的异常即可。
注意:自己定义时,一定要有默认构造方法,跟String message参数构造方法
自己定义的异常类继承的父类的异常,重写方式跟之前学的重写方式并无两样,如上图,但是重写的函数不能比父类可以解决的异常的问题更广泛。除过父类是RuntimeException.
注意:Exception是所有异常类的父类