异常
- 编辑 -> 编译 -> 链接 -> 运行
- 异常的层次结构:
- 异常的分类
- 检查性异常:编译的时候会被检查到(必须解决:try…catch)
- 非检查异常:编译的时候不会被检查到,运行的时候会被检查到(Error和RuntimeException都是非检查异常)
- 异常的处理
-
捕获异常(try——catch——finally)当前方法有能力处理异常,捕获并处理它
catch、finally不可以同时省略
demotry {//try块中存放可能出现异常的代码 1. 如果抛出异常,从抛出的异常的代码行停止运行try块中的其他代码, 继续执行catch块中的代码 2. 如果没有抛出异常,执行完try块后不执行catch块,执行catch块后面的内容 } catch(要处理的异常和标识符) { 1. catch块中的小括号需要加上一种错误类型 2. catch的执行要看异常的类型,只有指定的类型才可以使得catch块执行 3. 存放的是出现异常之后的代码 } catch() {//执行完其中一个catch之后,其他的catch语句会被忽略(子类一定要在父类前面) ... } .... .... } finally { 1. 回收资源,<有final的时候可以没有catch> 2. 不论try块是否检查出异常,finally语句都会执行 }
-
抛出异常(throw、throws)当前方法没有能力处理异常,交由方法调用者来处理
demopublic void doA(int a) throws Exception1,Exception3 {//throws是方法可能抛出的异常的声明,在声明方法的同时,表示该方法可能抛出的异常 try { ...... } catch (Exception1 e) { throw e; } catch (Exception2 e) { System.out.println("出错了"); } if(a!=b) { throw new Exception3("自定义异常"); } }
常见异常
- NullPointerException:空引用异常
- NumberFormatException:数值类型异常
- ClassNotFoundException:没有程序员要用到的类
- ArrayIndexOutOfBoundsException:访问超出索引
- ClassCastException:类型转换异常
断言
断言语句不会永远执行,可以屏蔽也可以启用
断言语句不可以修改变量和改变方法的返回值