异常:
在程序运行过程中,出现的不正常情况叫做异常
- 1、相同的代码在运行的时候,根据输入的参数或者操作的不同,有可能会发生异常,有可能不会发生异常
- 2、 应该在写代码的过程中尽可能的保证代码的正确性,不要到处都bug
- 3、如果要解决代码中出现的异常,需要添加非常复杂的代码逻辑来进行判断,会使代码变得非常臃肿,不利于维护,可读性比较差
- 4、程序在运行过程中如果出现了问题,会导致后面的代码无法正常执行,而使用异常机制之后,可以对异常情况进行处理。同时后续的代码会继续执行,不会中断整个程序
- 5、在异常的处理过程中,不要只是简单的输出错误,要尽可能的讲详细的异常信息进行输出
- 6、e.printStackTrace():打印异常的堆栈信息,可以从异常信息的最后一行开始追踪,寻找自己编写的java类
一、异常处理的方式:
1.1、try...catch捕获异常
try{ 代码逻辑 }catch(Exception e){ 异常处理逻辑 } try{ 代码逻辑 }catch(具体的异常Exception e){ 异常处理逻辑 }catch(具体的异常){ }
- 可以针对每一种具体的异常做相应的更丰富的处理
注意:当使用多重的catch的时候一定要注意相关异常的顺序,将子类放在最前面的catch,父类放在后面的catch。执行过程中可能存在的情况:
- 1、正常执行,只执行try中的代码
- 2、遇到异常情况,会处理try中异常代码之前的逻辑,后面的逻辑不会执行,最后会执行catch中的代码
- 3、使用多重catch的时候,会遇到异常子类不匹配的情况,此时依然会报错,因此建议在catch的最后将所有的异常的父类写上
1.2、throw抛出自定义异常
if(条件判断){ throw new Exception("业务逻辑异常。。。"); }
1.3、throws声明异常
public static void test() throws{ "会发生异常代码"; } public static void main(String[] args) throws { test(); System.out.println("hehe"); }
以上代码输出语句不会被执行,因为test方法抛出了异常,main方法也没有进行捕获,继续抛给jvm。
public static void test() throws{ "会发生异常代码"; } public static void main(String[] args) throws { try { test(); } catch (Exception e) { e.printStackTrace(); } System.out.println("hehe"); }
以上代码输出语句会被输出,因为异常已经被处理。
二、try...catch...finally执行顺序总结
总结:try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:
-
情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。
-
情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。
-
情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
-
1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
-
2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。