(Exception)异常
异常概述
在我们编写程序的过程和编译运行程序的时候都不能保证我们的程序永远不会出错,Java程序运行过程中所发生的异常事件可分为两类:
错误(Error):JVM系统内部错误,资源耗尽严重情况。
异常(Exception):其它编程错误或偶然的外在因素导致的一致性问题,例如:
对负数开平方根
空指针访问NullPointerExcetion
试图读取不存在文件FileNotFonundException
网络连接中断
什么叫异常?
程序中导致程序中断的一些情况叫做异常,一般程序员可以处理。
处理异常的两种方式:throws和try…catch…finally
try快的功能和规则:try块内部一般写编程人员可能会出现的异常代码,使程序运行不会因为出现异常而中断。
catch块的功能和规则:
功能:可以截取声明的异常,并在语句块内对其进行处理;
规则:
catch(Exception e){
System.out.println("this is an Exception!"):
}
finally块的功能和规则:
finally块一般写一些不论是否发生异常都必须执行一次的代码,例如关闭与数据库的连接等。
throw和throws的功能和使用方法:
throw指编程人员主动抛出一个异常:throw new NullPointerException();
throws指程序遇到异常情况的被动抛出一个异常:public void test() throws Exception()。
什么是预定义异常?
java程序中预先定义好的异常就叫做预定义异常。
1.异常: 就是程序中不正常的现象(错误和异常)
2. 异常的体系结构
Throwable
Error:☞ 程序员不能处理的情况,需要修改底层源代码
Exception : ☞ 需要程序员处理的情况
☞RuntimeException :在运行阶段出现的问题
☞编译异常 :在编译阶段出现的问题
3. 异常处理的2种方式
自己解决: try...catch ... finally
别人解决: throws
4. 创建异常对象
new 异常类("错误信息");
抛出异常对象
throw new 异常类("错误信息");
5. 注意事项
1> 运行时异常被抛出可以不处理,因为JVM会处理
2> 如果父类抛出了异常,子类覆盖父类的方法时 只能有3种选择
第1种:不抛出任何异常
第2种:抛出和父类方法一样的异常
第3种:抛出和父类方法一样的异常的子异常
3> 一个try可以匹配多个catch,若catch的异常类之间存在继承关系 则子类异常必须在父类异常的前面
Throwable类
Throwable 类中常用方法
1> String getMessage() 返回异常信息 / by zero
2> void printStackTrace() 使用红色字体打印错误信息(异常名称,错误信息,位置) java.lang.ArithmeticException: / by zero at com.override.Demo.main(Demo.java:7)
3> String toString() 使用简短的字符串描述错误 java.lang.ArithmeticException: / by zero 1234567
异常和错误的区别
异常: 指程序在编译、运行期间发生了某种异(xxxxxxxException),我们可以对异常进行具体的处理, 若不处理程序就会结束运行。
错误: 指程序在运行期间发生了某种错误(XXXXXError),Error错误通常没有具体的处理方式 程序将会结束运行,Error错误发生往往是系统级别的问题例如JVM所在系统发生的 并且反馈给JVM,我们无法针对处理,只能修改代码。
异常的分类
jdk运行: A.java -----编译器javac.exe编译------> A.class -------解释器java.exe运行------> 机器码
编译时检查异常: 在编译阶段就会出现的异常
运行时异常(RuntimeException): RuntimeException及其它的子类,可以通过编译,但是在运行 的时候出现的异常
如何尽量避免异常的产生的过程
在编写程序时,我们必须要考虑程序出现问题的情况。
例如: 在定义方法时,方法需要接收参数,那么当调用方法时, 需要给方法的参数赋值, 首先需要对参数进行合法的判断, 若数据不合法,就应该告诉告诉调用者,你传递的参数是错误的 需要传递合法的参数,这时可以通过抛出异常的方式告诉他。
throw 关键字
抛出异常“对象”
作用:可以使用 throw 关键字,在指定的方法中抛出指定的异常对象
格式:throw new XXXXXException("填写异常产生的原因");
注意:① throw 关键字 必须写在方法的内部
② throw 关键字 后面 new 对象必须是 Exception 或者 Exception的子类
③ throw 关键字
情况1: 抛出的是 检查异常,则我们必须处理这个异常
throw new Exception("异常的原因");
//我们必须要手动处理这个异常,
//处理异常有两种: 不负责任 throws往外抛
// 负责任 try...catch
情况2: 抛出的是运行时异常(RuntimeException 或者 RuntimeException的子类) 我们可以不处理,默认交给JVM处理(打印错误信息,中断程序)
异常处理的方式
try…catch…finally 捕获异常(自己处理)
捕获: java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定的方式处理 。
格式:
try{
// 可能产生异常的代码(没有异常的代码也可以定义在try中)
// try块中,一旦出现异常,则抛出异常的那句代码后面的代码都不执行啦
// 疑似病人(可能有病,或者没有病)
}catch(异常类名 变量名){
// 数据类型,必须是Exception或者Exception的子类
// 新冠病 ,匹配这个,才会执行这个代码,就会进隔离区
//异常的处理语句,抓取到 和 异常类名一样的的对象才执行
}catch(异常类名2 变量名){
// 普通流感 ,匹配这个,才会执行这个代码
}finally{
//不论是否有异常,finally中内容都会执行(执行1遍)
//不论是有病还是没病,都会从新检测指标
}
System.out.println(“1**”); //以下的代码就可以正常的执行啦
注意:
- try 存放是可能会出现异常的代码,异常有0个或者n个
- catch 用来进行某种异常的抓取,实现对抓到的异常对象进行处理 一个try可以匹配多个catch,catch是有顺序要求的
1> 若多个catch的异常类之间没有继承关系,则顺序随便
2> 若多个catch的异常类之间有继承关系,则 子类异常必须在父类异常的上面
- finally: 不论是否有异常都会执行
try…catch…finally组合方式
<1> try...catch....finally
<2> try...catch
对代码进行异常检查,并对检测到异常对象,传递给catch,并对异常进行处理
public void m(){
try{
throw new Exception("错误原因");
}catch(Exception e){
e.printStackTrace(); //打印错误信息
}
}
<3> 一个 try 和多个 catch
public void m(){
try{
throw new Exception("错误原因");
}catch(xxxxxException e){
}catch(yyyyyException e){
}catch(zzzzzzException e){
}
}
//注意: 若多个catch都没有匹配到异常对象,则抛出JVM处理
// catch的异常类有继承关系,子类异常定义在父类异常的上面
<4> try....finally组合
public void show(