目录

异常


异常

1 、什么是异常

1.1 哪些不是异常

  • 语法错误
  • 逻辑错误

1.2 不可预知的非正常的情况

  • 例如:网络中断,用户不合适的输入,硬盘已满,操作系统崩溃,内存溢出等

2 、异常的体系结构

2.1 java.lang.Throwable

  • 所有异常和错误的超类
  • (1)只有这个类型或它子类的对象才能被“抛出”
  • (2)只有这个类型或它子类的对象才能被“捕获”

2.2 分为两大类

  • java.lang.Error

    • 严重

    • 例如:VirtualMachineError

      • StackOverflowError

      • OutOfMemoryError

        • 简称OOM

        • 如何解决

          • 设计合理
          • 修改JVM的参数
  • java.lang.Exception

    • 运行时异常RuntimeException

      • 空指针异常:NullPointerException
      • 数组下标越界异常:ArrayIndexOutOfBoundsException
      • 类型转换异常:ClassCastException
      • 算术异常:ArithmeticException
      • 数字格式化:NumberFormatException
    • 编译时异常,受检异常

      • 在编译阶段必须要求你编写代码去处理,否则编译不通过
      • 例如:SQLException,IOException等

3 异常的处理机制

3.1 、过程描述

  • Java虚拟机会在发生异常的那句代码的位置,创建一个异常的对象,并且抛出,这个时候,它会检测有没有try..catch,如果有对应的catch,那么程序正常运行,如果没有合适的catch,会被往上抛出,如果一路上都没有被catch,最终会导致程序终止运行。

3.2 、两种方式

  • try…catch

    • 语法结构

      • try{ 可能发生异常的代码 }catch(异常的类型 e){ 捕获该异常后如何处理 }catch(异常的类型 e){ 捕获该异常后如何处理 }catch(异常的类型 e){ 捕获该异常后如何处理 } … finally{ 不管是否发生异常都要执行的代码 }

下面的代码

- 执行特点

	- (1)如果try中没有异常,那么如果有finally,就执行finally,然后再执行[下面的代码]
	- (2)如果try中有异常,try剩下的代码就不执行了,直接去找对应的catch,如果有对应的catch,就执行,然后如果有finally,就执行finally,然后再执行[下面的代码]
	- (2)如果try中有异常,try剩下的代码就不执行了,直接去找对应的catch,如果没有对应的catch,然后如果有finally,就执行finally,[下面的代码]就不执行,抛出上级

- 语法特点

	- 可能没有catch
	- 可能没有finally
	- 多个catch异常类型的顺序是"子上父下"

- return和finally并存如何执行

	- 如果finally中有return,那么一定是从finally中返回
	- 如果finally中没有return,会先执行finally中的语句,然后return结束,但是返回的值是在执行finally之前就赋好值的
  • throws

    • 语法结构

      • [修饰符] 返回值类型 方法名(形参列表) 抛出的异常列表
    • 注意

      • (1)throws后面可以是多个异常,不分顺序

      • (2)如果方法重写

        • 重写方法抛出的异常<=被重写方法抛出的异常类型

4 自定义异常

4.1 、自定义异常一定要继承Throwable或它的子类

  • 原因是因为

    • (1)只有这个类型或它子类的对象才能被“抛出”
    • (2)只有这个类型或它子类的对象才能被“捕获”

4.2 、一般来说声明两个或以上的构造器

  • (1)无参构造
  • (2)异常类型(String message)

4.3 、都需要序列化

4.4 、自定义异常的对象只能自己new并手动抛出,使用throw关键字

  • 当然抛出后,就可以通过throws继续往上抛或使用try..catch处理

5 异常的关键字

5.1 try

  • 尝试执行某些代码,看是否发生异常

5.2 catch

  • 捕获异常

5.3 finally

  • 不管是否发生异常都要执行的代码

5.4 throw

  • 手动抛出异常

    • 系统预定义异常
    • 用户自定义异常

5.5 throws

  • 把异常抛出上级

6 异常

6.1 抛

  • 1、JVMnew并且抛出
  • 2、自己new并通过throw抛出

6.2 处理

  • 1、throws继续抛给上级
  • 2、当下处理try..catch

6.3 捕获

  • try..catch