异常的祖宗Throwable
常用方法 getMessage();获得异常信息,Throwable的属性,构造函数初始化的信息printStackTrace();打印异常栈轨迹toString();输出异常的类名和信息 public String toString() { String s = getClass().getName(); String message = getLocalizedMessage(); return (message != null) ? (s + ": " + message) : s; }代码 Throwable throwable = new Throwable("错了"); System.out.println(throwable.getMessage()); System.out.println(throwable.toString()); throwable.printStackTrace(); 结果: 错了 java.lang.Throwable: 错了 java.lang.Throwable: 错了 at java7_0.Demo4.main(Demo4.java:8)异常的分类
Error错误:一般不是由代码解决的问题Exception异常:一般是程序的问题 运行时异常:在程序运行时报出的问题(非受检异常) 通过可以通过if,else等判断后限制后保证程序的健壮 同样也可以用try{}catch(){}代码块捕获,让程序继续进行下去 非运行时异常:在程序编译时报错的问题 必须通过try{}catch(){}代码块捕获异常注意事项
多个异常处理:父类异常(范围大的异常要放在后面),不然编译不会通过,多个catch只会做一个,报错最先捕获的异常,在发生异常的地方从上到下寻找能够匹配的异常类型,然后不会在做catch的语句,直接跳出try语句,往后面执行
package java7_0; class Father1{ } class Son1 extends Father1{ } public class Demo5 { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.println(); int[] arr = { 1, 2 }; arr = null; Father1 f = new Father1(); div(1, 0, arr, f); System.out.println("over"); } private static void div(int i, int j, int[] arr, Father1 f) { // TODO 自动生成的方法存根 try{ Son1 s = (Son1) f; System.out.println(i / j); System.out.println(arr[1]); }catch(ClassCastException e){ e.printStackTrace(); System.out.println("类型不符"); }catch (NullPointerException e) { // TODO: handle exception e.printStackTrace(); System.out.println("空指针异常"); }catch (ArrayIndexOutOfBoundsException e) { // TODO: handle exception e.printStackTrace(); System.out.println("数组越界"); }catch (Exception e) { // TODO: handle exception e.printStackTrace(); System.out.println("其他异常"); } System.out.println("结束"); } private static void div(int i, int j) { // TODO 自动生成的方法存根 System.out.println(i/j); } } 结果: java.lang.ClassCastException: java7_0.Father1 cannot be cast to java7_0.Son1 at java7_0.Demo5.div(Demo5.java:29) at java7_0.Demo5.main(Demo5.java:20) 类型不符 结束 over同时也说明编译看左边,运行看右边。编译不报错,运行报错可见ClassCastException为运行时异常
finally:不管什么时都要执行的,return都不行,只有一种情况,那就是在try或者catch中调用System.exit(0);
catch的另一作用可以让catch中做默认的事情,当程序没接收到用户的配置的时候可以使用默认配置,比如用户输入的配置文件不存在,在catch中就可以使用默认配置文件throws的作用在函数后面声明有异常,用逗号隔开,在函数体重通过throw new Exception()抛出异常,函数调用者需要处理这个异常。要么try{}cacth(){},要么同样继续throws;