异常
习题的引入
异常:Exception,在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,称为发生异常。
用if-else堵漏洞的缺点:
-
-
-
- 代码臃肿,业务代码和处理异常的代码混在一起;
- 可读性差;
- 花费大量时间;
- 很难堵住所有漏洞。
-
-
try-catch-finally
基于上述,异常处理机制:try-catch-finally
异常查看
原理:
把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的()中的那个异常对象接受,接受以后:执行catch后面的{}里面的代码,然后try-catch后面的代码,该怎么执行就怎么执行。
详细说明:
- try中没有异常,catch中代码不执行;
- try中有异常,catch进行捕获;
- 如果catch中异常类型和出现的异常类型匹配的话:不执行catch中的代码,没有捕获成功,程序相当于遇到异常,中断了,后续代码不执行;
注意:
- Try中若出现异常,catch捕获成功的话,try中后续的代码不会执行,但try-catch后面的代码还是执行没有影响。
处理方式
- 什么都不写。什么都不做;
- 输出自定义信息;
- 打印异常信息,
- 打印ex.toString()方法,显示异常的类名(全限定路径)
- 打印ex.getMessage()方法,如果没有就显示null;
- 调用printStackTrace()方法;显示异常的堆栈信息,在控制台将异常的效果给我们展示出来,方便我们查看异常信息
- 抛出异常:throw ex;
问题+final
- 什么情况下try-catch后面代码不执行?
- Throw抛出异常的情况
- Catch中没有正常的进行异常捕获;
- 在try中遇到return;
- 怎么样才可以将try-catch后面的代码,必须执行?
- 只需要将必须执行的代码放入finally中,那么这个代码无论如何一定执行。
- return和final执行顺序?
- 先执行final,后执行return。
- 什么代码会放在finally中?
- 关闭数据库资源;
- 关闭IO流资源;
- 关闭socket资源。
- 有一句代码可让finally中代码不执行!
- System.exit(0);//终止当前虚拟机执行。
多重catch
- Try中出现异常之后,将异常类型和catch后面的异常类型依次比较,按照代码的顺序进行比对,执行第一个与异常类型匹配的catch语句;
- 一旦执行其中一条catch语句之后,后面的catch语句就会被忽略了;
- 在安排catch语句的顺序的时候,一般会将特殊异常放在前面(并列),一般化的异常放在后面;
- 先写子类异常,在写父类异常。
- 在JDK1.7之后,异常新处理方式:可以并列用|符号链接:
异常的分类
层次结构
注意:语法错误不属于异常
Error:Erro(错误):JVM系统内部错误、内存溢出、靠程序本身无法解决、程序员不关注
运行时异常
写代码时,不用特意对异常进行处理,在程序运行以后,系统自动检测,然后报出异常。
检查异常:
- :防患于未然的效果,在写代码时对代码的异常进行处理
处理方式
- try-catch嵌套
- 多重catch
处理方式3:
- Throws
throw和throws区别:
throw和throws的区别:
- 位置不同
- throw:方法内部
- throws:方法的签名处,方法的声明处
- 内容不同:
- throw+异常对象(检查异常,运行时异常)
- throws+异常的类型(可以多个类型,用,拼接)
- 作用不同:
- throw:异常出现的源头,制造异常。
- throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现声明的这些异常,然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常
重载与重写异常
- 重载:重载的方法间 抛出异常无关
- 重写
子类的异常类型<=父类
自定义异常
可以继承运行异常,也可以继承检查异常
public class MyException extends NullPointerException{
static final long serialVersionUID = -70348971907457L;
public MyException() {
}
public MyException(String message) {
super(message);
}
}
- 如果继承的是运行时异常,那么在使用的时候无需额外处理;
- 如果继承的是检查异常,那么在使用的时候需要try-catch捕获或者throws向上抛