①异常②自定义异常
一、Java中问题概述
一般来说有个2/8原则,一个程序员80% 的精力在处理20%可能发生异常的代码
Java中问题分为错误(Error)和异常(Exception)
错误:不能用代码解决的问题,往往是环境或者硬件的问题
异常:可通过修改代码或者预处理来解决的不正确情况,称为异常
异常分为编译期异常和运行时异常,如果抛编译异常,语法上调用者必须处理或往上抛;抛运行时异常,调用者可不往上抛
Java里边结束的3中方式:
①正常执行完
②return返回
③发生异常,没有处理,强制结束
都是返回方法的调用处
处理异常的方式:
①捕获异常,不让它沿调用栈继续抛出
②捕获,并继续向下抛出
③不捕获,导致方法从调用栈中弹出
二、捕获异常 try catch finally
try{
try块(尝试)
}catch(Exception Type){
catch块(捕捉)
}finally{
finally块(总会执行)
}
try块如果发生异常,抛出异常,跳到对应的catch块,执行问catch块后跳出,(不会再执行匹配后边的catch)。最后加Exception,防止有未捕获到的异常。
Exception要写在最后,catch有顺序,有继承关系的,子类在前,父类在后。
try后边可以接多个catch,复杂代码中多种异常处理可以提升用户体验。
finally块总会执行,即使有break,return,都会执行完finally再return,代码级别能关闭finally的只有System.exit();
所以这里一般用作清理一些资源,比如流的关闭,链接的关闭
catch和finally必须要配套try,不能单独出现,可以有
try catch,catch
try finally
try catch finally
三、抛异常 throw
throw Exception 方法声地方,后边跟抛出的异常类型(语句)
throws 后边可接多种异常类型,子类抛出的异常不能比父类多(不是指个数,而是范围)
方法声明完整格式:访问修饰符、可选修饰符、返回类型、方法名(形参列表) throws 异常类型1,2,3
Throwbale这里有两个方法比较重要:
-getMessage(得到异常信息,不是所有的异常都有异常信息,这里的信息比如除数为0)
-printStackTrace(打印堆栈信息)
throw抛异常(主动抛)非常有用,
抛编译异常,方法里必须处理(trycatch或者往上抛),如果往上抛,调用者也必须trycatch或者往上抛
抛运行异常,可以不用往上抛,或者trycatch
四、自定义异常:
①创建一个类继承Exception
②添加构造方法和普通方法
构造方法里主要是各种异常类型,普通方法里可以写日志等等
③在一个方法中抛出异常
④在另一个方法中捕获异常并处理
好处:不用每一处都处理,直接往上抛
遇到异常统统往上抛,可以把所有的异常全部抛到表现层,在表现层进行处理,并调用自定义异常的写日志等方法存起来
public class LovoException extends Exception{
public LovoException() {
}
public LovoException(Exception e){
//JVM产生的异常,使用多
super(e);
}
public LovoException(String message){
//根据业务异常,构造,使用较少
super(message);
}
public void writeLog (){
//各种日志文件
this.getStackTrace();
System.out.println(this.getMessage());
}
}
public void count() throws Exception {
int a = new Scanner(System.in).nextInt();
try {
int b = 3 / a;
System.out.println(3/a);
} catch (Exception e) {
// throw new LovoException(e.getMessage() + "除数不能是0");
throw new LovoException(e);
}
}