java学习日记20230330-异常

发布时间 2023-03-30 23:30:35作者: 、子夜

异常基本概念

  • java语言中,将程序执行中发生的不正常情况称为异常,开发中的语法错误和逻辑错误不是异常;
  • 执行中的异常事件可以分为两类
    • error(错误),java虚拟机无法解决的严重问题:如jvm系统内部错误,资源耗尽:StackOverflowError【栈溢出】和OOM(out of memory)
    • exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问,读图读取 不存在的文件,网络连接中断等,分为运行时异常和编译时异常;
  • 异常体系图
    • java源程序-编译异常——字节码文件-运行异常——在内存中加载运行类
    • 异常分为两大类,编译时异常和运行时异常
    • 运行时异常,编译器不要求强制处置的异常,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及其子类都是运行时异常
    • 对于允许时异常,可以不做处理,因为这类异常很普遍,若泉处理可能会对程序的可读性和运行效率产生影响
    • 编译时异常,时编译器要求必须处置的异常
  • 常见运行时异常
    • NullPointerException空指针异常
      • 当程序试图在需要对象的方法使用null时,抛出该异常
    • ClassCastException类型转化异常
      • 当试图将对象强制转化为不是实例的子类时,抛出该异常
    • ArithmeticException数学运算异常
      • 当出现异常的运算条件时,抛出此异常
    • ArrayIndexOutOfBoundsException数据下标越界异常
      • 用非法索引访问数组时抛出的异常,如果索引为负或大于等于数组大小,则该索引为非法索引
    • NumberFormatException数字格式不正确异常
      • 当应用程序试图将字符串转化成一种数值类型时,但该字符串不能专为为适当格式,则抛出异常
  • 编译异常:在编译期间,就必须处理的异常,否则代码不能通过编译
    • SQLException 操作数据库时,查询表可能发生异常
    • IOException操作文件时,发生的异常
    • FileNotFoundException 当操作一个不存在的文件时,发生异常
    • ClassNotFoundException 加载类,而该类不存在时,异常
    • EOFException 操作文件,到文件末尾,发生异常
    • IIIegalArgumentException 参数异常
  • 异常处理机制
      • try-catch-finally:当异常发生时,系统将异常封装成Exception对象e,传递给catch,得到异常对象时,自定义处理,不管try代码块是否有异常发生,始终要执行finally,如果没有发生异常,catch代码块不会执行,finally一般时资源释放
        • java中提供try和catch块来处理异常,try中包含可能出错的代码,catch块用于try块中发生的异常;
        • try{可以的代码,将异常生成对应的异常对象,传递给catch块}catch(异常){对异常的处理};
        • 如果异常发生,则异常发生后面的代码不会执行,直接进入catch块
        • 如果异常没有发生,则顺序执行try的代码块不会进入到catch
        • 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源)则使用finally{}
        • 可以有多个catch语句捕获不同的异常,要求父类异常在后,子类异常在前,比如Exception在后,NullPointerException在前
        • 可以进行tr-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉,应用场景就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
        • public class TryCatchDetail01 {
              public static void main(String[] args) {
                  try {
                      int n1 = 10/1;
                      String str = "123";
                      int a = Integer.parseInt(str);
                      System.out.println(a);
                      Person person = new Person();
                      person = null;
                      person.getName();
                  } catch (ArithmeticException e) {
                      System.out.println(e.getMessage());
                  } catch (NumberFormatException e) {
                      System.out.println(e.getMessage());
                  } catch (NullPointerException e) {
                      System.out.println(e.getMessage());
                  }finally {
                      System.out.println("finally");
                  }
              }
          }
          class Person{
              private String name ="jack";
          
              public String getName() {
                  return name;
              }
          }
          View Code

           

      • throws:JVM——MAIN方法——其他方法,throws可以将异常范围给上一层级,jvm输出异常信息,终止程序,默认采用throws方法