【JAVA】 03-Java中的异常和包的使用

链接:

  • 笔记目录:毕向东Java基础视频教程-笔记

  • GitHub库:JavaBXD33

目录:

<>


  • <>

内容待整理:

异常

异常和错误的发生和区别

  • 异常:java运行期间发生的问题就是异常。

  • 错误:

    • java中运行时发生的除了异常Exception还有错误error
    • 异常:通常发生可以有针对性的处理方式的
    • 错误:通常发生后不会有针对性的处理方式
      • error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的,无法针对处理,只能修正代码。

异常发生的过程

  • 示例:对给定数组,通过给定的角标获取元素。当角标越界时,异常发生的过程:

  • 两个报错位置:

    • 一个类中的主函数调用语句 int num = getElement(arr, 4);
    • 另一个类中的被调用语句 int element = arr[index];
  • 具体发生过程:

    • 被调用函数中:

      没有找到4的角标,运行时发生了问题,这个问题JVM认识
      这个问题java本身有描述,描述内容有: 问题的名称,问题的内容,问题的发生位置
      既然有这么多信息,java就将这些信息直接封装到对象中:对象名 -- ArrayIndexOutOfBoundsException
      throw new ArrayIndexOutOfBoundsException(index);//问题对象。函数到这里就结束了。
      jvm将问题抛给调用者main。
    • 主函数中:

      主函数就收到了越界异常对象。没有处理
      main函数就会继续抛出调用者jvm
      jvm收到问题后,就做出了最终的处理方式。
      将问题对象中的名称、信息、问题的位置,都显示在屏幕上,让软件使用者知道。
      同时,让程序提前终止。
    • tips -- 两个调用者:

      • 函数的调用者:main函数
      • main函数的调用者:JVM

异常的简单应用

  • 考虑异常的必要性:

    • 在编写程序时,必须要考虑程序的问题情况。
    • 举例:卖水果功能需要传递钱参数,有可能有假币。
    • 所以定义程序需要考虑程序的健壮性。
    • 处理:加入一些逻辑性的判断。
  • 注:编译--检查语法错误,运行--传值等,故是在运行时报异常

  • 角标越界和空指针异常的自定义

    • 主函数调用:int num = d.detElement(arr, 3)

      • 当arr=null,空指针异常;当索引实参小于0或大于等于arr长度,角标越界异常。
    • 几种非异常抛出的处理的不合理之处:

      • 若仅打印提示语句,则下面的语句仍执行,不可。这一步已经错了,应该停止程序
      • 若return -1,return表示程序正常结束,不可。这一步已经错了,无法继续执行,必定不能正常结束。
    • 逻辑判断+异常抛出格式:

      if(....){ new throw XxxXxx("..."); }
    • 空指针异常示例:

      throw new NullPointerException("arr指向的数组不存在");
    • 数组角标越界异常示例:

      throw new ArrayIndexOutOfBoundsException("错误的角标, "+index+"索引在数组中不存在");
  • 无效参数异常

    • 定义Person对象、构造函数初始化时判断年龄值age是否符合规范

    • 逻辑判断+异常抛出

      if(age<0 || age>200){ new throw IllegalArgumentException(age+",年龄数值异常"); }
    • 注:新学一个异常,通过查阅API文档中“空指针异常”的父类的子类找到

    • 注:发现大部分异常都可以传String类型的参数来辅助说明

异常的自定义&体系&问题解决

  • 在自定义异常的过程中遇到问题、解决问题的历程和经验

    • 自定义class NoAgeException -- 报错:不兼容 -- 引出Throwable
    • Throwable首字母大写,猜测是类或接口 -- 查阅API文档 -- Throwable是异常和错误的超类
    • Throwable说明:自定义异常被抛出,必须继承Throwable或其子类 -- Throwable有两个子类:Error和Exception
    • 选择性地继承Exception:class NoAgeException extends Exception -- 报错:未报告的异常错误,必须对其进行捕获或声明
    • 对照之前的几个java定义好的异常,查阅其API文档:这几个异常的父类都是RuntimeException
    • 查阅RuntimeException的API文档:RuntimeException执行时,异常以及其子类都无需进行声明 -- 对应错误提示“声明”二字
    • 自定义异常类改为继承RuntimeException:class NoAgeException extends RuntimeException -- 可以抛出,但没有显示实参信息
    • 查阅java定义好的异常的源码:发现其构造函数中带String参数的都继承了父类 super(s); -- 加入super(s)后可以正确抛出并显示提示信息了
  • 问题解决tips:

    • 分析错误提示,提取关键词
    • 查阅API文档并阅读
    • 查阅源码并分析、仿写
  • 自定义异常类最终版:

    class NoAgeException extends RuntimeException{ NoAgeException(){ super(); } NoAgeException(s){ super(s); } }

编译时的异常和运行时的异常的区别

  • 异常分为两种:编译时异常和运行时异常

    • 编译时异常:编译器会检测的异常。(语法范围,必须捕获或声明)

    • 运行时异常:编译器不会检测的异常。不需要声明。

      • 如果声明了,就需要调用者给出处理方式。
  • 列举几种常见的运行时异常:

    • IllegalArgumentException
    • NullPointerException
    • IndexOutOfBoundsException
    • ClassCastException
  • Exception需要声明而RuntimeException不需要捕获或声明:

    • 不是功能本身发生的异常,而是因为比如调用者传递参数错误而导致功能运行失败,则不需要声明。
    • 这时也是问题,需要通过异常来体现,但是这个异常不需要声明出来。
    • 声明的目的是为了让调用者进行处理。
    • 不声明的目的是不让调用者进行处理,就是为了让程序停止,让调用者看到现象,并进行代码的修正。
      • 对于“代码修正”,Error同样是代码修正,但是Error是系统底层抛出的,一般是严重错误;而运行时异常是合理范围之内,和底层没有关系。

声明和捕获

  • 声明

    • 将问题标识出来,报告给调用者。
    • 如果函数内通过throw抛出了编译时异常,而没有捕获,那么必须通过throws进行声明(表示这个方法有可能有问题),让调用者去处理。
    • 格式:类名后不加空格直接跟throws+异常类
    • 示例:
      void show(int x)throws Exception
      Person(String name, int age)throws NoAgeException
    • 注:调用者(如主函数)选择捕获处理时不需要在调用者(如main后)加声明,而抛异常的函数仍需要throws声明,否则报错。
  • 捕获

    • java中对异常有针对性的语句
    • 语句:
      try{ //需要被检测的语句。}
      catch(异常类 变量) //参数 { //异常的处理语句。}
      finally{ //一定会被执行的语句。 }
    • 注1:其中catch语句的参数“异常类”为声明中throws后面跟的异常类
    • 注2:其中finally语句块可以省略
    • 注3:python中的类似语句块:try.. except.. else...(else可省略)
  • tips:

    • 编译器先检查语法等问题,最后才检查异常问题,故当看到编译失败显示的是异常错误,那么恭喜,说明其他的都没问题了。
  • 示例思考:构造函数到底抛出NoAgeException继承Exception呢?还是RuntimeException呢?

    • 继承Exception,则:

      • 必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行
      • 但是如果后面使用到了Person对象的数据,会导致全都失败
    • 继承RuntimeException,则:

      • 不需要throws声明的,这时调用是不可能编写捕获代码的,因为调用根本就不知道有问题
      • 一旦发生NoAgeException,调用者程序会停掉,并由jvm将信息显示到屏幕上,让调用者看到问题,并修正代码

运行时异常的应用

END

转载于:https://www.cnblogs.com/anliux/p/11141831.html

你可能感兴趣的:(java,python)