异常概念

  • 英文Exception,所谓异常处理,就是指程序在出现问题时依然可以正确的执行完毕。

    java面向对象处理异常过程

  • 抛出异常:在执行方法时,如果发生异常,则方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE

  • 捕获异常:JRE得到异常后,寻找相应的代码来处理该异常JRE在方法的调用栈中查找,从生成异常的方法开始回溯,知道找到相应的异常处理代码为止

image.png

异常分类

CheckedException

编译期必须要处理的,通过try catch finally语法结构来处理,finally语句一定执行

  1. // 测试try catch语句用法
  2. public static void testTryCatchFinally(){
  3. FileReader reader = null;
  4. try{
  5. reader = new FileReader("d:/a.txt");
  6. char c1 = (char)reader.read();
  7. char c2 = (char)reader.read();
  8. }catch(FileNotFoundException e) {
  9. e.printStackTrace();
  10. }catch(IOException e) {
  11. e.printStackTrace();
  12. }finally {
  13. if(reader != null){
  14. try{
  15. reader.close()
  16. }catch(IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }
  22. // 测试声明式抛出异常,例如Dateformat类中的parse方法会抛出ParseException
  23. // 声明式异常可直接通过try catch语句处理 或者继续声明式抛出异常
  24. public static testDeclareException() throws ParseException{
  25. Dateformat df = new Dateformat("yyyy-MM-dd");
  26. String str = "2049-10-1"
  27. Date d = df.parse(str);
  28. }
  29. // 测试try-with-resource 可以自动关闭实现了AutoClosable接口的类
  30. // 编译器语法糖 底层还是try catch finally
  31. // 下例和第一例效果一致,reader是实现了AutoClosable接口的类的实例
  32. public static void testTryCatchFinally(){
  33. try(FileReader reader = new FileReader("d:/a.txt")){
  34. char c1 = (char)reader.read();
  35. char c2 = (char)reader.read();
  36. }catch(Exception e) {
  37. e.printStackTrace();
  38. }
  39. }

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 {
    1. Person p = new Person();
    2. p.setAge(-1);
    3. System.out.println(p.getAge());
    } }

class IllegalAgeException extends Exception{ // 默认无参构造器 public IllegalAgeException() {}; public IllegalAgeException(String message) { super(message); } }

class Person{ private int age;

  1. public int getAge() {
  2. return age;
  3. }
  4. public void setAge(int age) throws IllegalAgeException {
  5. if (age < 0){
  6. throw new IllegalAgeException("年龄不得小于零岁");
  7. } else {
  8. this.age = age;
  9. }
  10. }

} ```

编辑器调试图解

image.png