java学习日记20230330-异常

异常基本概念

  • 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
          复制代码
        • 如何没有出现异常,则执行try块中的所有语句,不执行catch块中语句,如果有finally,则最后还需要执行finally语句
        • 如果出现异常,则try中异常发生后,剩下的语句不再执行,将执行catch中的语句,如果有finally,最后还需要执行finally语句
        • 如果catch中有return,则会内存中隐式生成一个临时变量存储数据,执行完finally后,返回临时变量
      • throws:JVM——MAIN方法——其他方法,throws可以将异常范围给上一层级,jvm输出异常信息,终止程序,默认采用throws方法
        • 如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
        • 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是他的父类
        • 复制代码
          public class Throws01 {
              public static void main(String[] args) {
                  try {
                      f1();
                  } catch (FileNotFoundException e) {
                      System.out.println("yichagnle ");
                  }
              }
          
              public static void f1() throws FileNotFoundException,NullPointerException {
                  //编译异常
                  FileInputStream fis = new FileInputStream("d://aa.txt");
              }
          }
          View Code
          复制代码
        • 对于编译异常,程序中必须处理
        • 对于运行时异常,程序如果没有处理,默认就是throws方法
        • 子类重写父类时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常类型一致,要么为父类抛出的异常类型的字类型
        • 在throw过程中,如果有方法try catch,就相当于处理异常,就可以不必throws
        • 复制代码
          public class Throws02 {
              public static void main(String[] args) {
                  f2();
              }
          
              public static void f2(){
                  int n1 = 10;
                  int n2 = 0;
                  double res = n1/n2;
              }
          }
          
          class Father{
              public void method() throws RuntimeException{
          
              }
          }
          class Son extends Father{
              @Override
              public void method() throws RuntimeException{
                  super.method();
              }
          }
          View Code
          复制代码
      • 自定义异常
        • 当程序中出现了某些错误,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息
        • 定义类:自定义异常类名继承Exception或RuntimeException
        • 如果继承Exception,属于编译异常
        • 如果继承RuntimeException,属于运行异常
        • 复制代码
          public class CustomException01 {
              public static void main(String[] args) {
          
                      Person01 person = new Person01(180);
                      try{
                      if(person.getAge()<18 || person.getAge()>120){
                          throw new AgeOverLimit("年龄超过限制");
                      }}
                      catch(Exception e){
                          System.out.println("yichagnle");
                      }
          
              }
          }
          
          class AgeOverLimit extends RuntimeException{
              //一般情况把自定义异常继承运行时异常,可以使用默认处理机制
              public AgeOverLimit(String message) {
                  System.out.println(message);
              }
          }
          
          class Person01{
              private int age;
          
              public int getAge() {
                  return age;
              }
          
              public void setAge(int age) {
                  this.age = age;
              }
          
              public Person01(int age) {
                  this.age = age;
              }
          }
          View Code
          复制代码
      • throw和throws的区别

        •  throws:异常处理的一种方式,方法声明处,异常类型

        •  throw:手动生成异常对象的关键字,方法体中,异常对象

           
posted @   、子夜  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示