java 异常

异常

一、异常的概念
异常:程序在正常运行过程中出现了不正常的情况
异常处理的必要性:一旦程序中出现异常,程序就会终止,可能会导致严重的损失。
二、异常的分类
Throwable

  • Error 严重的错误
    无需处理
    StackOverFlowError 栈内存溢出错误
  • Exception 异常
  • 编译时异常(已检查异常)
    编译期间可以检查出来的异常
    除了RuntimeException及其子孙类其他的都是编译时异常
    编译时异常必须要处理,否则程序无法执行
  • 运行时异常(未检查异常)
    编译期间检查不出来 运行时才能发现的异常
    RuntimeException及其子孙类都是运行时异常
    运行时异常可以处理也可以不处理
    三、异常的产生
    (1)自动产生异常
    程序在执行过程自己产生了异常
    例如:
    System.out.println(5/0);
    (2)手动产生异常–掌握
    格式:
    throw new 异常类(String message);
    手动产生运行时异常:
    throw new RuntimeException(“故意产生了一个运行时异常”);
    手动产生编译时异常:
    throw new Exception(“故意产生了一个编译时异常”);

四、异常的传递性
异常传递的方向和方法调用的方向相反
当出现异常调试Bug时,读异常信息应该找上边的异常信息
五、异常的处理–掌握
(1)消极处理-直接抛出
普通方法抛出异常将异常抛给了方法调用者
main函数抛出异常将异常抛出给JVM虚拟机
JVM虚拟机接到异常,直接停止程序,以红色字体打印异常信息,之后的代码程序无法继续执行。

格式:方法()的后边通过throws关键字声明要抛出异常类型
权限修饰符 返回值数据类型 方法名(参数列表) throws 异常类型1,异常类型2,…{
可能有异常的方法体代码
}
例如:
参考代码Demo4
注意:
1、如果希望简化throws之后的异常类型,可以使用父类异常类型来匹配多个子类异常对象
2、如果throws后边既有子类异常又有父类异常,则必须子类异常在前。

(2)积极处理-try catch finally捕获异常
try catch语句之后的程序代码是可以继续执行的。
格式一:
try{
可能出现异常的代码;
} catch(异常类型 变量名){
变量名.printStackTrace();//打印异常堆栈信息
处理异常的代码;
}
格式二:
try{
可能出现异常的代码;
} catch(异常类型1 变量名){
变量名.printStackTrace();//打印异常堆栈信息
处理异常的代码;
} catch(异常类型2 变量名){
变量名.printStackTrace();//打印异常堆栈信息
处理异常的代码;
}…
执行原理:
当出现异常时,判断异常对象的类型和catch的类型是否匹配,按照从上到下依次进行匹配,当匹配到时,执行该catch语句中的代码处理异常。
注意:
1、如果异常处理方式相同的情况下,可以使用父类异常类型捕获多个子类异常对象
2、如果catch既有子类异常又要捕获父类异常,子类异常在父类异常的前边
格式三:
try{
可能出现异常的代码;
} catch(异常类型1 变量名){
变量名.printStackTrace();//打印异常堆栈信息
处理异常的代码;
} catch(异常类型2 变量名){
变量名.printStackTrace();//打印异常堆栈信息
处理异常的代码;
}finally{
无论是否出现异常都要执行的代码;
}
应用场景:
通常在finally实现资源的关闭,例如io流资源的关闭、数据库连接的关闭等
格式总结:
try{} catch(){}
try{} catch(){}catch(){}…
try{} catch(){}finally{}
try{} catch(){}catch(){}…finally{}
try{}finally{} //释放资源的
try catch finally语句可以嵌套使用
try{
try{}catch(){}catch(){}finally{}
} catch(){}

try{} catch(){
try{}catch(){}catch(){}finally{}
}
try{} catch(){}finally{
try{} catch(){}finally{}
}
六、异常的API
printStackTrace()
打印异常的堆栈信息
如果catch中没有调用当前方法,可能会将异常的堆栈提示信息给吞掉了,会导致问题排查有困难
String getMessage()
获取异常的详细提示信息
可以通过该方法传递异常信息数据
七、自定义异常–掌握
如果项目中需要和业务需求相关的异常,则需要自定义异常。
(1)自定义编译时异常–继承Exception父类
格式:
public class 异常类名 extends Exception{
public 异常类型(){}
public 异常类名(String message){
super(message);//调用父类的有参构造
}
}
(2)自定义运行时异常–继承RuntimeException父类
格式:
public class 异常类名 extends RuntimeException{
public 异常类型(){}
public 异常类名(String message){
super(message);//调用父类的有参构造
}
}
八、方法覆盖(方法重写)–理解–记忆
概念:
在子父类中,存在方法名相同、参数列表也相同的方法
要求:必须遵守 否则编译会报错,无法执行
返回值数据类型

  • 基本数据类型 void 要求子类的和父类必须相同
  • 引用数据类型 要求子类的类型要小于等于父类的类型
    权限修饰符
    要求子类的要大于等于父类的权限修饰符
    方法抛出的异常
    要求子类抛出的异常的类型要小于或者等于父类的异常类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值