一、java的异常体系

Throwable

Error---错误。一般是由于jvm或者是硬件引发的问题,所以一般不会通过代码去处理,可以看下硬件或者外部对接系统或中间件等问题

Exception----异常,一般是代码中的问题,通过修改代码去解决

二、异常的处理方式

异常的捕获和异常的抛出

捕获异常:

try{
可能出问题的代码;
}catch(出现的异常类型    自定义变量){
处理异常的代码
}

如下代码:

public class ExcpetionDeal {
public static void main(String[] args){
div(4,0);
}
public static void div(int a,int b){
int result = 0;
try{
result = a/b; //这句代码在b = 0时明显不符合逻辑,可能会出现问题
}catch (ArithmeticException e){ //ArithmeticException是异常类型
e.printStackTrace(); //我们处理的方式就是打印出出问题的栈 }
System.out.println("result:"+result);
}
}

注意事项:  1、try{....}catch(){...} 中代码如果出现了异常,程序不会阻塞,外面的程序会继续执行下去

2、try后面可以使用多个catch,处理多个类型的异常类型,但是第一个catch中异常类型的包含范围不能大于第二个catch中的类型(比如第一个catch异常类型是Exception,第二个catch中异常类型是ArithmeticException,Exception是一个总的 异常类,内部包括ArithmticException,这种情况下编译会报错)

3、如果try块中的代码出现了异常,则try中异常代码后面的语句将不会被执行

抛出异常:

关键字:throw  throws

public class Throw {
public static void main(String[] args) throws Exception{ //main方法可以选择抛出异常给jvm或者对异常进行捕获处理
Div(4,0);
}
public static void Div(int a,int b) throws Exception{ //Div方法抛出异常给调用者main
if (b==0){
throw new Exception();
}
int result = a/b;
System.out.println(result);
}
}

如上是当b = 0的时候对异常进行抛出的代码。。

那么什么时候使用异常的捕获,什么时候使用异常的抛出呢?

--------一般情况下,如果需要通知到调用者你的代码出现了问题,这个时候使用抛出处理,如果代码是与用户直接打交道的异常,千万不能再抛,再抛会抛给用户了这个时候就使用捕获处理了

Exception中并不是包含了所有的异常类型,现实生活中还有许多的异常类型未被定义,这个时候我们可能需要自定义一些异常类型,去完成异常的处理;

举个例子:我要去吃一碗牛肉面,一万10块钱,当我钱不够的时候怎么办呢?这就相当于一种异常,我们需要事先定义一个异常类LessOfMoneyToEat

public class LessOfMoneyToEat extends Exception { 定义一个异常类,继承自Exception类

public LessOfMoneyToEat(String message){ 定义一个都早方法传入一些信息
super(message);
}
}

这种简单的写法其实就相当于自定义了一个异常类型,调用方法和其他异常类型调用方法是一样的:

ublic class Main {
public static void main(String[] args) throws LessOfMoneyToEat{ //直接抛出的写法
int money = 9;
/* 这里注释的写法是捕获的写法
try{
Eat(money);
}catch(LessOfMoneyToEat e){
e.printStackTrace();
System.out.println("借点钱吃个饭。。。");
}
*/
Eat(money);
}
public static void Eat(int money) throws LessOfMoneyToEat{
if(money < 10){
throw new LessOfMoneyToEat("啊哦,钱带少了。。。");
}
System.out.println("吃地沟油木桶饭。。。");
}
}

异常处理的时候有时候会使用到finally关键字

fanally块:必须要有try才能使用

finally块中的代码在任何情况下都会执行的,除非退出java虚拟机非常适合做释放资源的工作,这样子可以保证资源文件在任何情况下都被释放。。。

认识了finally代码块之后,常用到的异常捕获的格式其实会有三种:

第一种: 比较适用于有异常要处理,但是没有资源要释放的。

ry{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}

第二种:比较适用于既有异常要处理又要释放资源的代码。

try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码
}finally{
释放资源的代码;
}

第三种: 比较适用于内部抛出的是运行时异常,并且有资源要被释放。

try{
可能发生异常的代码
}finally{
释放资源的代码;
}