异常的祖宗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;