5.异常

异常的继承体系:

异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。 

Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。

Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。

运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)

Object

      |-- Throwable

           |-- Error                         错误

           |-- Exception                 编译异常,受检异常

                 |-- RuntimeException   运行异常,非受检异常

Throwable中的常用方法:

public void printStackTrace() :打印异常的详细信息。

包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

public String getMessage() :获取发生异常的原因。

提示给用户的时候,就提示错误原因。

public String toString() :获取异常的类型和异常描述信息(不用)。

jvm虚拟机处理异常的方式


Throw与throws的区别:
  1. throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
  2. throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常对象抛给方法调用处。
 

throw关键字:

      代表主动抛出一个异常,搞事情。

      throw new 异常类(参数);

     格式:

      异常类 异常对象名 = new 异常类(参数); // 首先创建一个异常对象

      throw 异常对象名; // 然后再抛出

5.异常

throws关键字:

      代表本方法当中出现了异常,我不管。甩锅。

      修饰符 返回值类型 方法名(参数类型 参数名称) throws 异常A, 异常B {

           方法体

      }

注意事项:

1. throws后面可以写上多个异常类的名称,使用逗号分隔即可。

2. throws后面如果多个异常之间存在继承关系,那么只写父异常即可,但是   
都写上也不算错。

3. 无论是编译异常还是运行异常,都可以写在throws的后面表示甩锅。但是运行异常一般不用写也可以。

java.util.Objects工具类

其中有可以进行非空检查的方法

5.异常

选择try-catch还是throws的时候,评判标准:

    
如果我这个方法中产生了异常,我就不应该再继续执行方法了,应该中断,那么就要使用throws。【直接崩】

    如果我这个方法中产生了异常,但是我还应该继续向后执行,那么就要使用try-catch。【还能继续】

异常处理try-catch语句:

      try {

           // 被检测的代码

      } catch (异常类 异常对象名) {

           // 处理异常的代码

      }

 

代码执行流程:



如果try当中没有发生异常,那么catch语句不会执行。

如果try当中发生了异常,那么try当中剩下的语句就不会再执行

    如果catch捕获成功,那么将会执行catch当中的代码。然后继续后面

    如果catch捕获不成功,那么异常将会继续抛给上一级。

5.异常

异常处理try-catch-finally语句:

      try {

           // 被检测的代码

      } catch (异常类 异常对象名) {

           // 处理异常的代码

      } finally {

           // 一定会被执行的语句

      }

     只有两个人可以阻止finally的运行:

           1. System.exit(int)方法:直接和JVM打交道,上帝模式退出程序。

           2. 电脑停电。

5.异常

可以使用多个catch语句:

      try {

          

      } catch (A a) {

          

      } catch (B b) {

          

      }

5.异常

      要求:如果互相之间存在继承关系,必须保证子类异常在前面,父类异常在后面。

      5.异常

5.异常

5.异常

可以在一个catch当中捕获多种异常:

      try {

          

      } catch (A | B | C ex) {

          

      }

      要求:用竖线分隔的多种异常之间,不能存在继承关系。如果有继承,应该只写父类异常。

      5.异常

方法覆盖重写的时候,必须保证:

      子类方法的throws异常范围,【小于等于】父类的范围。

 

Throwable当中的常用方法:

      getMessage():获取细节信息。

      toString():异常名称+细节信息。

      printStackTrace():打印异常栈信息(异常发生的位置信息)。

     

自定义的异常

使用步骤:

 

      1. 定义一个类,继承一个已经存在的异常。

      2. 编写一个无参数的构造方法。

      3. 编写一个String参数的构造方法,并且调用super(String);

5.异常

5.异常

5.异常

编译异常:Exception及其子类,但是除了RuntimeException及其子类

      1. 要么try-catch处理

      2. 要么throws甩锅

      写上有红线,不能不理会。

     

运行异常:RuntimeException及其子类

      1. 可以try-catch处理

      2. 也可以throws甩锅

      3. 还可以根本不理会,没有红线

 

自定义异常举例:

5.异常

5.异常

常见异常,及产生原因

问题:请列举常见异常,并说明产生原因。

答:

NullPointerException:空指针异常。

         当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。

ArrayIndexOutOfBoundsException:数组索引越界异常。

当对数组的索引值为负数或大于等于数组大小时抛出此异常。

ArithmeticException:算术运算异常。

         程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。

NumberFormatException:数字格式异常。

         当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。