一、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{
释放资源的代码;
}