java中的异常

  
以able结尾的一般都是接口,able在英语里面就是表达能不能意思。
接口表示能不能具有某个功能。
 一图胜千文
异常:就是程序运行时候出现不正常情况。
异常的由来: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");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值