异常概念
英文Exception,所谓异常处理,就是指程序在出现问题时依然可以正确的执行完毕。
java面向对象处理异常过程
抛出异常:在执行方法时,如果发生异常,则方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE
- 捕获异常:JRE得到异常后,寻找相应的代码来处理该异常JRE在方法的调用栈中查找,从生成异常的方法开始回溯,知道找到相应的异常处理代码为止
异常分类
CheckedException
编译期必须要处理的,通过try catch finally语法结构来处理,finally语句一定执行
// 测试try catch语句用法public static void testTryCatchFinally(){FileReader reader = null;try{reader = new FileReader("d:/a.txt");char c1 = (char)reader.read();char c2 = (char)reader.read();}catch(FileNotFoundException e) {e.printStackTrace();}catch(IOException e) {e.printStackTrace();}finally {if(reader != null){try{reader.close()}catch(IOException e) {e.printStackTrace();}}}}// 测试声明式抛出异常,例如Dateformat类中的parse方法会抛出ParseException// 声明式异常可直接通过try catch语句处理 或者继续声明式抛出异常public static testDeclareException() throws ParseException{Dateformat df = new Dateformat("yyyy-MM-dd");String str = "2049-10-1"Date d = df.parse(str);}// 测试try-with-resource 可以自动关闭实现了AutoClosable接口的类// 编译器语法糖 底层还是try catch finally// 下例和第一例效果一致,reader是实现了AutoClosable接口的类的实例public static void testTryCatchFinally(){try(FileReader reader = new FileReader("d:/a.txt")){char c1 = (char)reader.read();char c2 = (char)reader.read();}catch(Exception e) {e.printStackTrace();}}
RuntimeException
含return异常处理方式
try catch语句含return语句,会在任何执行try中的return语句之前,都会先执行finally语句,finally中有return语句的话,直接return
可视化bug追踪
自定义异常
自定义异常只需要从Exception类或者他的子类派生一个子类即可
- 自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类
- 习惯上自定义异常类应该包含2个构造器,一个是默认构造器,一个是带有详细信息的构造器
```java
public class TestException {
public static void main(String[] args) throws Exception {
} }Person p = new Person();p.setAge(-1);System.out.println(p.getAge());
class IllegalAgeException extends Exception{ // 默认无参构造器 public IllegalAgeException() {}; public IllegalAgeException(String message) { super(message); } }
class Person{ private int age;
public int getAge() {return age;}public void setAge(int age) throws IllegalAgeException {if (age < 0){throw new IllegalAgeException("年龄不得小于零岁");} else {this.age = age;}}
编辑器调试图解

