Java 异常
异常的引入:
在生活中:
小明放学回家
在学校(编译时期)
1.不要闯红灯
2.记得带伞
3.不要和陌生人说话
在路上(运行时期)
1.闯绿灯被撞了
2.碰瓷
3.被抢劫
4.地震 (Error)
到家里(执行结束)
异常的概念:
异常的本质就是Java当中对可能出现的问题进行描述的一种对象体现
异常的分类
异常: 凡是Excetption的子类都是异常
编译时异常: 在编译时期发生的异常,程序员可以处理,因为编译会报错,
Exception的子类但不是RuntimeException的子类
运行时异常: 在运行时期发生的异常,程序员也可以处理,一般都是代码的逻辑性不够严谨不够健壮,依赖的是程序员的经验
RuntimeException的子类都是运行时异常
严重错误: 在程序执行的整个阶段,都可发生错误,错误是无法解决的,可以避免 例如: StackOverflow
处理异常的目的
并不是为了修复程序的错误,而是就算程序出现了错误,也能够让程序继续执行
jvm默认是如何处理异常的?
1.打印错误信息
a.异常名称 java.lang.ArithmeticException
b.异常的消息 / by zero
c.异常所发生的方法位置 at com.sxt.exceptiondemo.ExceptionDemo.main
d.异常所在Java文件中 ExceptionDemo.java
e.异常发生行号 1
2.终止程序
System.exit(0);
JVM处理异常的方式不能够满足我们开发的需求,那么我们需要自己处理异常.
如何来处理异常?
方式一: try...catch..finally
方式二: throws
方式一处理异常:
异常处理的格式:
try{
//放置程序可能出现问题的代码
}catch(异常类 异常名){
//这里放置异常处理的代码
} finally{
//释放资源
}
注意:
1.try块的代码越少越好
2.try块中一旦发生异常,那么try块中发生异常后面所有的代码都不会被执行
3.多个catch块只会执行一个
4.Exception接受异常必须放在异常的最后面,满足先子类后父类
异常的执行流程:
1.程序执行到错误行,系统会创建一个异常对象,并且抛给我们
2.程序进入catch块进行逐个匹配
匹配成功,程序执行catch块代码
匹配失败,交给jvm处理
处理异常的标准方式:
1.能够显示处理的尽量显示处理,提高程序的可读性
2.但是一定要在异常处理的最后加上 父类Exception处理
1.打印错误信息
a.异常名称 java.lang.ArithmeticException
b.异常的消息 / by zero
c.异常所发生的方法位置 at com.sxt.exceptiondemo.ExceptionDemo.main
d.异常所在Java文件中 ExceptionDemo.java
e.异常发生行号 1
2.终止程序
System.exit(0);
处理编译时异常和运行时异常
编译时异常的处理: Ctrl + 1
运行时异常的处理: try..catch throws
有了try...catch处理异常,为什么还需要throws处理方式?
在某些情况下,我们不会处理异常,或者我们没有权限异常,干脆我就不想处理异常
在这种情况下我们可以抛出异常,在方法上抛出
谁调用我有问题的方法就谁处理
千万不要交给虚拟机处理
throws处理异常的格式
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
}
有了throws为什么还需要throw?
格式:
throw 异常对象;
谁调用就将将对象抛给谁
当抛出的是编译时异常的时候,必须要在方法体上声明异常
当时运行时异常的时候,可以不用声明,但是建议声明
面试题:
throw和throws的区别
1.throws出现在方法的声明上,throw关键出现在方法内
2.throws表示一种异常的可能性,throw表示程序的必然性
3.throws可以声明多个异常类,throw只能够抛出一个异常
4.throws声明的是异常类,throw抛出的是异常对象
finally碰到return
finally一定会执行
执行顺序?
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。 在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果, 因此,即使finally中对变量x进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。
自定义异常
异常的本质就是Java中对错误问题的描述的一种对象体现
Java提供的异常不够我们自己使用,我们需要自定义异常,自己应用在我们的开发中
自定义异常的步骤
1.创建一个异常类继承 Exception或者RuntimeException
2.在自定义异常类中书写构造方法即可
a.无参构造
b.带错误信息的构造方法
finally关键字
1.finally修饰代码块一定会被执行,除非碰到程序退出
2.一般用来释放内存资源,比如关闭IO流的输入输出对象,数据库连接对象等等...