9.异常
-
异常
-
在程序运行过程中,出现不正常的情况叫做异常;
-
注意:
- 相同的代码在运行的时候,根据输入的参数或者操作的不同,有可能会发生异常,有可能不会发生异常。应该在写代码的过程中尽可能保证代码的正确性。
- 如果要解决代码中出现的异常,需要添加非常复杂的代码逻辑来进行判断,会使代码变得非常臃肿,不利于维护,可读性比较差。因此,推荐使用异常机制来处理程序运行过程中出现的问题。
-
Java中处理异常的关键字:
- try、catch、finally、throw、throws;
- 通过异常处理,程序即使在运行过程中出现问题,也可以对异常情况进行处理,同时后续代码也会继续执行,不会中断整个程序;
- 在异常处理过程中,不要只是简单的输出错误,要尽可能详细地将异常信息打印出来,e.printStackTrace():打印异常的堆栈信息。
- 当使用多重catch的时候一定要注意相关异常的顺序,将子类放在最前面的catch,父类放到最后面的catch。
- 在程序处理过程中,如果处理异常的部分出现finally的处理,那么无论代码是否发生异常,finally中的代码总会执行;除非在try块或者catch块中调用System.exit(1)方法;
-
finally包含哪些逻辑处理:
- IO流的关闭操作一般设置在finally中;
- 数据库的连接关闭操作设置在finally中。
-
finally返回(return的情况):
- 如果finally中有return语句,则回将try中的return语句覆盖掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值;
- 如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句,会接着执行try中的return语句,返回保留之前的值;
- 如果finally中没有return语句,但是有改变要返回值,这里与引用相似,分以下两种情况:
- 如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句必然会返回进入finally块之前保留的值;
- 如果return的数据是引用数据类型,在finally中对该引用数据类型的属性值的改变是生效的,try中的return语句返回的就是在finally中改变后的该属性的值。
-
-
练习:
-
声明异常:
- 在方法调用过程中,可以有N多个方法调用,此时假如每个方法都包含了异常情况,可以将异常向外抛出,最后集中处理;
- 如何判断使用throws还是try...catch:
- 最稳妥的方式是在每个方法中都进行异常处理;
- “偷懒的方式是判断整个调用的过程中,外层的调用方法是否有对异常的处理,如果有,直接使用throws,如果没有,就要使用try...catch”。
-
自定义异常:
-
在Java中提供了非常丰富的异常类,但是在某些情况下不能满足需求,此时需要自定义类。步骤:
- 继承Exception类;
- 自定义实现构造方法;
- 需要使用的时候, throw new 自定义异常的名称。
-
什么情况下使用
- 一般情况不需要自己定义;除非公司明确要求,或者要求异常格式规范统一的时候是必须要求自己实现的。
-
-
异常分类:
- Error;
- Runtime Exception运行时异常;
- Exception;
- throw用户自定义异常。
-
常见的异常:
1. NullPointerException空指针异常;
2. ArrayIndexOutOfBoundsException数组越界异常;
3. IOException输入输出异常;
4. ClassCastException类型强制转换异常;
5. FileNotFoundException文件未找到异常。 -
throw与throws的区别:
-
throw:
- 作用在方法内,表示具体抛出异常,有方法体内的语句处理;
- 具体向外抛出一个异常实体类。若执行了throw则表示一定发生了异常。
-
throws:
- 作用在方法声明上,如果表示抛出异常,则由该方法的调用者来处理异常;
- 声明的方法可能会抛出该类型的异常,让调用该方法的使用者知道捕获异常的类型;
- 出现异常是可能性,而不是必然性。
-
-