一、概述:Java的异常体系
java中Throwable是异常体系的超类,直接来源于Object类,Throwable可以分为Error类和Exception类,分别表示错误和异常
1、Error类是程序无法处理的错误,由jvm产生和抛出,遇到错误,jvm一般会选择终止线程
2、Exception类分为RuntimeException(运行时异常)和非运行时异常
RuntimeException:例如空指针异常,数组越界异常等,开发时应避免此类异常。也称为非受检异常。
非运行时异常:就是Exception类中除运行类异常之外的异常,如果不处理这类异常,程序都无法编译通过,例如io异常和sql异常。
try,catch语句
如果没有try、catch包裹,代码就不会执行打印语句,如果有try语句,那么捕获异常后就会打印出来,不会影响后续代码的执行
public static void main(String[] args) { int[] a = new int[5]; for (int i = 0; i <10; i++) { a[i] = i; } // try { // for (int i = 0; i <10; i++) { // a[i] = i; // } // } catch (Exception e) { // e.printStackTrace(); // } // System.out.println("----------------"); }
1、throws抛出异常
如果定义了一个B方法,然后通过throws抛出异常,当B方法产生了异常,throws就会向上抛出这个异常,比如A方法调用了B方法,B方法抛出的异常就需要A来捕获处理。
public static void main(String[] args) { Test test = new Test(); try { test.run(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("--------------"); } public void run() throws CloneNotSupportedException { this.sun(); } public void sun() throws CloneNotSupportedException { User user01 = new User(); User user02 = user01.clone(); System.out.println(user01); System.out.println(user02); user01.ChangedPerson("李四"); System.out.println(user01.getPerson()); System.out.println(user02.getPerson()); }
2、throw抛出异常
我们可以在方法内,手动抛出一个异常,在上层捕获,写在方法的内部,抛出异常后,后面的代码不会执行,然后就是进行异常的处理。在catch语句中处理。同样也可以在catch语句中向上层抛出一个异常。
Try{ //可能会发生异常的代码 }catch(Exceptione){ throw newException(e); }
异常处理的步骤:
try语句中是可能会产生异常的代码,catch语句中如果产生了这个异常,执行对应的操作语句,finally语句,就是一定会执行的代码。
try catch语句使用的方式
1、try,catch,finally均不能单独使用,try···catch // try···catch ···finally
2、try,catch,finally中变量的作用域均是内部的代码块,如果在这三个块中访问,则需要将变量定义在外部。
3、多个catch块时最多只会匹配一个catch块,其余不会执行
4、先catch子类异常,再catch父类的异常
try、catch捕获示意图: