异常

JAVA(异常)

异常的体系结构

  最顶级的Throwable:错误,异常

  Error:正常情况下,不太可能出现,绝大多数Error都会导致程序处于一个非正常的状态下, 基本上很难恢复。在外力的作用下,不考虑。Error是Throwable的子类,它是在Java 程序处理范围之外的

  Exception:在Java语言中,将程序执行中发生的不正常的情况称之为异常。Exception也是 Throwable的子类。

  编译期异常:写代码的时候,抛异常。如果编译器不解决,会编译不通过

  运行期异常:RuntimeException,运行时会抛异常,平时没事

自定义异常:

Java中异常机制虽然很完善,但是结合实际业务还差很多。

年龄出现负数需要自定义异常、电商搜索乱码需要自定义异常

怎么自定义异常?

  1. 所有的异常必须是Throwable的子类
  2. 如果要定义一个编译期异常,需要继承Exception类
  3. 如果要定义一个运行期异常,需要继承RuntimeException类

 

异常链

一个异常被抛出去之后会继续被调用这个方法的方法捕获或抛出,异常会扩散

只要说解决异常、处理异常、捕获异常就是try ... catch

 

throws

如果一个方法没有捕获一个编译期异常,该方法必须使用throws来声明

1.在方法里直接try ... catch解决

public void info(){
    try{
         show();   
    }catch (MyException e){
        e.printStackTrace();   
    }
}

2.在方法里抛异常给主函数,在主函数里try ... catch解决

public void show() throws Exception{
}
//JVM
public static void main(String[] args){
    try{
         new Ch01().info();
    } catch (Exception e){
         e.printStackTrace();   
    }
}

规定:主方法里不允许继续往下抛异常

throws并不是真正的解决了异常,只是把异常抛给了下一级调用者。

 

throw和throws的区别

throws出现在方法的声明处,可以抛出多个异常(用逗号隔开)

throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
      用在方法声明后面,跟的是异常类名
      可以跟多个异常类名,用逗号隔开
      表示抛出异常,由该方法的调用者来处理
      throws表示出现异常的一种可能性,并不一定会发生这些异常
throw:则是用来抛出一个具体的异常类型。
      用在方法体内,跟的是异常对象名
      只能抛出一个异常对象名
      表示抛出异常,由方法体内的语句处理
      throw则是抛出了异常,执行throw则一定抛出了某种异常  

 throw:就是自己处理一个异常,有两种方式要么是自己捕获异常try...catch代码块,要么是抛出一个异常(throws 异常)

 

finally关键字:

  • finally用来创建在try码块后面执行的代码块
  • 无论是否发生异常,finally代码块中的代码一定会执行。一班finally中的代码都是用来释放资源的。
  • Finally无论是否出现异常,都会执行

 

补充

catch可以写多个异常(可以捕获多个异常)

重写的另一个规则:重写的方法不能抛出比被重写方法更大的异常类型

 

 

习题:

一,简答题
   问题:
   1. 请描述异常的继承体系
   2. 请描述你对错误(Error)的理解
   3. 请描述你对异常(Expection的理解)
   4. 请描述你对运行时异常(RuntimeException)的理解

   答:

   1. 异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
   java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。 
   2. Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。
   3. Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。
   4. 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。

  练习二:throw与throws的区别
   问题:
   1. 请描述throw的使用位置,作用是什么?
   2. 请描述throws的使用位置,作用是什么?

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

  练习三:异常的处理方式
   问题:
      1. 异常处理方式有几种,分别是什么?
      2. 详细阐述每种方式对异常是如何处理的
   答:
   1. 异常的处理方式有两种,分别是使用throws和try...catch...finally
   2. throws用在方法的声明上后接异常类名,是把异常抛给调用者进行处理
   3. try...catch...finally是捕获异常,自己处理,处理完毕后面的程序可以继续运行
   a) try代码块中是可能出现异常的代码
   b) catch代码块,是遇到异常,对异常进行处理的代码
   c) finally代码块是无论是否发生异常,都必须执行的代码,用于释放资源.


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

   答:
   NullPointerException:空指针异常。
    当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
   ArrayIndexOutOfBoundsException:数组索引越界异常。
   当对数组的索引值为负数或大于等于数组大小时抛出此异常。
   ArithmeticException:算术运算异常。
    程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
   NumberFormatException:数字格式异常。
    当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

 

posted @ 2022-07-30 08:53  一只神秘的猫  阅读(42)  评论(0)    收藏  举报