概述:异常是java程序运行时出现的一些意外情况。
异常的分类:所有的异常都继承自java.lang.Trowable类,Trowable类有两个直接子类,Exception和error。
异常的层次结构图:
error是java程序本身无法恢复的严重错误,一般不进行捕获,处理,一般是通知用户并终止程序执行。
检查时异常一般是由通过throws抛出的,该方法的调用者必须在调用该方法时进行捕获、处理,否则将不能进行编译。
异常的处理:使用try{
}catch(Exception e){
}finally{
}
示例:
public class Test { public static void main(String[] args) { try{ String [] s={"l","u","n"}; for(int i=0;i<=s.length;i++){ System.out.println(s[i]); } System.out.println("gg"); }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); }catch(Exception e){ System.out.println("程序出错!"); System.out.println(e.getMessage()); e.printStackTrace(); }finally{ System.out.println("very good"); } } }
try中如果发生异常,那么之后的代码将不会执行,将跳转到catch中。
在catch中 把ArrayIndexOutOfBoundsException封装到对象e中,可以用对象e来输出栈中的错误信息。
finally带码块一定会被执行(除了一种情况外,在catch中出现 System.exit(1)会结束JVM,不执行finally中的代码),即使在catch中写有return 语句finally中的代码依然执行。执行的过程先执行catch中return之前的代码,然后执行finally中的代码,接着回到return 返回结果。(如果最后面也有return 则该return 并不会执行)
示例:
public class Test_Runtime { public static int Conver(){ int a=10; try { //System.out.println(a); int b=5/0; //System.out.println(a); } catch (Exception e) { a=20; return a;//执行到这将跳到finally中执行,执行完finally中的代码,然后回到这 }finally{ a=30; System.out.println(a); } return a;//该句不会被执行 } public static void main(String[] args) { int a=Conver(); System.out.println(a); } }
输出的结果为:20 执行完finally后回到return 返回结果, 但是如果finally中也有返回语句则会直接返回,不会在回到catch中。
示例:
public class Test_Runtime { public static int Conver(){ int a=10; try { //System.out.println(a); int b=5/0; //System.out.println(a); } catch (Exception e) { a=20; return a; }finally{ a=30; return a;//在该处返回,不会在回到catch } } public static void main(String[] args) { int a=Conver(); System.out.println(a); } }
输出结果:30
如果返回的是引用(可以证明finally里面的代码确实执行了)
public class TestException { public static int[] Conver(){ int []a=new int[10]; try { int b=5/0; //System.out.println(a); } catch (Exception e) { a[0]=10; System.out.println(a[0]); return a;//执行到这将跳到finally中执行,执行完finally中的代码,然后回到这 }finally{ a[0]=30; System.out.println(a[0]); } return a;//该句不会被执行 } public static void main(String[] args) { int[] a=Conver(); System.out.println(a[0]); } }
输出结果 10 30 30
throw 和throws关键字的区别:throw在方法体内,只能抛出一个异常,在方法体内进行处理,也可以不处理,但必须用throws向外抛出,由方法的调用者去处理。
throws在方法体外,紧跟方法名后,一般为检查时异常,方法的调用则一般要进行处理(也可以继续向外抛)。
throws表示异常可能发生,但不一定会发生,throw表示抛出异常的这种动作,异常一定发生。
自定义异常时一般继承Exception或者RuntimeException即可。