![](https://i-blog.csdnimg.cn/blog_migrate/345b8c054203e4be39095451633de08a.png)
以able结尾的一般都是接口,able在英语里面就是表达能不能意思。
接口表示能不能具有某个功能。
一图胜千文
![](https://i-blog.csdnimg.cn/blog_migrate/c759e437b91de6826c692c4619c2bfb3.png)
异常:就是程序运行时候出现不正常情况。
异常的由来:Java是纯面向对象语言,异常就是Java用面向对象的思想将不正常的情况进行了封装。
如果访问了数组不存在的下标,java就把这个错误信息封装到ArrayIndexOutOfBoundsException这个类里面。
所有的异常都继承自Runnable接口。
异常的分类:
Error:非常严重的错误
(一般是出现的编译器的异常,不可以恢复,程序无法处理。)
一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。
Exception:并不是非常严重的错误。
一般是出现的代码异常,是可以被处理的,可以被恢复的。
Error和Exception的区别:
一、分类不同:
首先从继承方面来说,Error和Exception都是Throwable的子类。Error比Exception更严重,不易通过后续代码处理和修复,不应该被代码catch到的错误。
而Exception是指严重程度较轻的程序问题,相较于Error更容易被后续代码处理和修复的,有些需要通过try catch代码处理,有些不建议通过try catch代码处理。
二、含义不同:
Error就是程序运行时候抛出的最严重级别的错误了,如VirtualMachineError,ThreadDeath。抛出了Error的程序从Java设计的角度来讲,程序基本不可以通过后续代码修复,从而理应终止。
Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。
编译时异常(非运行时异常,
你在写代码时候就需要处理的异常
): 程序正确,但因为外在的环境条件不满足引发。例如:
这不是程序本身的
逻辑错误,
Java编译器强制要求必须处理这类异常,如果不去处理这个异常,程序就会报错。(读取一个硬盘上图片,读取的代码逻辑是正确的,但是这个图片所在的硬盘可能出现坏道,就没法读取这个文件,
未雨绸缪
提前检测可能会有读取硬盘问题)
运行期异常(RuntimeException,
代码运行时候抛出的异常
): 这意味着
程序存在bug,如数组越界,0被除,空指针....这类异常需要更改程序来避免,Java编译器强制要求处理这类异。
如果抛出运行时异常,是要根据抛出的异常的信息去分析程序的错误,在写代码时候绝大部分情况下不去try-catch运行时异常。
自定义异常:
继承Exception都是编译时异常。
继承自RuntimeException运行时异常
。
异常的处理:
try {
需要检查的代码(可能会抛出异常,也可能不会抛出异常)
} catch(异常的类型 异常类型的变量) {
捕获异常后要处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行)
}
编译时异常(非运行时异常、检查时异常)
编译时异常在写代码时候必须要处理这个异常,不处理就报错。
处理的方法有两种:
1、try-catch捕获这个异常,自己处理了这个异常
2、throws抛出异常,我不处理这个异常,抛出异常,用throws子句把他交给上层(调用方)处理。
多重捕获块(多个catch)
try {
需要检测的代码(可能会抛出异常,也可能不会抛出异常)
} catch (异常的类型1 异常类型的变量1) {
捕获异常后处理异常
} catch (异常的类型2 异常类型的变量2) {
捕获异常后处理异常
} catch (异常的类型3 异常类型的变量3) {
捕获异常后处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行,例如数据库释放连接)
}
return位置出现的多种情况
情况1: try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2: try{ return; }catch(){} finally{} return;
先执行try块中return 语句(包括return语句中的表达式运算),但不返回;
执行finally语句中全部代码
最后执行try中return 返回
finally块之后的语句return不执行,因为程序在try中已经return。
情况3: try{ } catch(){return;} finally{} return;
1、程序先执行try,如果遇到异常执行catch块,
有异常:
执行catch中return语句,但不返回
执行finally语句中全部代码,
最后执行catch块中return返回。 finally块后的return语句不再执行。
无异常:执行完try再finally再return…
情况4: try{ return; }catch(){} finally{return;}
执行try块return语句(包括return语句中的表达式运算),但不返回;
再执行finally块,
执行finally块,有return,从这里返回。
此时finally块的return值,就是代码执行完后的值
情况5: try{} catch(){return;}finally{return;}
程序执行catch块中return语句(包括return语句中的表达式运算),但不返回;
再执行finally块,
执行finally块,有return,从这里返回。
情况6: try{ return;}catch(){return;} finally{return;}
1、程序执行try块中return语句(包括return语句中的表达式运算),但不返回;
有异常:
//如果try{}中的语句有异常,try{}中异常语句后面的代码就不执行了
执行catch块中return语句(包括return语句中的表达式运算),但不返回;
再执行finally块
执行finally块,有return,从这里返回。
无异常:
再执行finally块
执行finally块,有return,从这里返回。。
throws、throw的区别:
区别一:throw 是在语句中抛出一个异常;throws 是方法抛出一个异常;
throw语法:throw <异常对象>
在方法声明中,添加throws子句表示该方法将抛出异常。
throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
其中:异常类可以声明多个,用逗号分割。
区别二:throws可以单独使用,但throw不能;
区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。
抛出异常应该使用的关键字是
throw
自定义异常:
1、所有的异常的都是Throwable的子类
2、如果写一个运行时异常,需要继承RuntimeException
3、如果要写一个编译时异常,继承Exception
案例:模拟银行转账,可以实现存钱和取钱的功能
取钱时候如果余额不够就抛出异常 MeiQianException
public class MeiQianException extends Exception{
//代表取钱的时候还差多少钱
private Double money;
public MeiQianException(Double money){
//super里面的字符串,代表当抛出这个异常的时候打印出的异常信息
super("余额不足还差" + money);//父类构造方法
this.money = money;
}
}
public class AccountAdmin {
//余额(当前帐户还有多少钱)
private Double balance;
public AccountAdmin(Double balance) {
this.balance = balance;
}
//存钱
public void deposit(double money) {
balance += money;
}
// 取钱
public void withdraw(double money) throws MeiQianException {
if (balance >= money) {
balance -= money;
} else {
double needMoney = money - balance;
// 当取钱余额不足的时候,给调用者抛出一个异常,而且这个异常
// 是编译时异常,需要取钱调用这个方法的人必须要未雨绸缪处理
throw new MeiQianException(needMoney);
}
}
public static void main(String[] args) {
AccountAdmin accountAdmin = new AccountAdmin(30000.0);
accountAdmin.deposit(200);
try {
accountAdmin.withdraw(40000.0);
} catch (MeiQianException e) {
e.printStackTrace();
} finally {
System.out.println("finally");
}
System.out.println("AccountAdmin.main");
}
}