Java基础十八(异常)

异常


什么是异常?
程序运行时期发生的问题就是异常
首先看一下我们之前学习遇到的一些也是比较常见的异常

  • 数组角标越界
    ArrayIndexOutofBoundsException

  • 空指针异常
    NullPointerException

  • 栈溢出异常
    StackOverFlowError

  • 堆溢出异常
    OutofHeapError

  • 类型转换异常
    ClassCastException

  • 数学异常
    ArithmeticException

  • 数据转换异常
    NUmberFormatException

我们发现有些是以Exception结尾的,有些是Error结尾的,Exception结尾的称为异常,Error结尾的称为错误,看一下区别:

  • 异常:程序运行期间发生了异常,通常可以由针对性的处理方式的。
  • 错误:程序运行期间发生了错误,通常不会有针对性的处理方式。错误的发生往往都是系统级别的问题,都是JVM所在系统发生的并反馈给JVM的,无法针对处理,只能修改代码。例如上面的 栈溢出异常StackOverFlowError 堆溢出异常 OutofHeapError无法针对处理。

我们如果用面向对象的思考方式对待异常异常应该有哪些内容?名称 位置 原因 ,这样异常就可以当成一个类去看待!程序有各种各样的错误,也就是异常的子类,这样异常继承体系就处来了 ,异常体系的顶层类是Throwable,当然它的最终父类也是Object。

异常的应用

在编写程序时,必须要考虑程序的问题情况。比如在写功能时,需要接受参数,在使用功能中使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,应该告诉调用者,传递合法的数据进来。这时需要使用异常这种方法来告诉调用者。所以定义程序需要考虑程序的健壮性。

一般来说当函数内部出现问题时,两种解决思路

  1. 要么函数内部自己解决
    return 正常结果
  2. 要么函数将问题反馈给调用者
    throw 异常对象

怎么使用异常呢?

  1. 创建一个异常对象。封装一些提示信息(自定义)。

  2. 需要将这个对象告知给调用者。怎么告知呢?怎么将这个对象传递到调用者处呢?通过关键字throw就可以完成。 throw异常对象;如:throw new ArrayIndexOutOfBoundsException(“错误的角标”);

  3. throw用在函数内,抛出异常对象,并可以结束函数。


异常分类

Error
严重性错误 JVM直接抛出内存错误 ,直接改代码吧

Exception异常
在函数内抛出Exception,编译失败,因为编译器在检查语法时发生了错误。该程序已经出现问题,Java认为这个程序本身存在隐患,需要捕获或者声明出来(你要么把问题处理,要么把问题标识出来让调用知道)

RuntimeException异常
抛出RuntimeException,不需要捕获,不要声明呢?不是功能本身发生的异常,而是因为比如调用者传递参数错误而导致功能运行失败。这也是问题,需要通过异常来体现,但是这个异常不要声明出来的。声明的目的是为了让调用者进行处理。不声明的目的是不让调用者进行处理,就是为了让程序停止,让调用者看到现象,并进行代码的修正。

异常分两种

  • 编译时异常:编译器会检测的异常。
  • 运行时异常:编译器不会检测的异常。不需要声明。声明也可以,如果声明了,无外乎就是让调用者给出处理方式

对于编译时异常 通常有两种处理方案

  1. 声明:将问题标识出来,报告给调用者。如果函数内通过throw抛出了编译时异常,而没有捕获,那么必须通过throws进行声明,让调用者去处理。
  2. Java中对异常有针对性的语句进行捕获。
    捕获格式:
try
{
        //需要被检测的语句。
}
catch(异常类 变量)//参数。
{
        //异常的处理语句。
}
finally
{
        //一定会被执行的语句。
}

throw和throws区别

  1. throw用在函数内。throws用在函数上。
  2. thorw抛出的是异常对象。throws用于进行异常类的声明,后面异常类可以有多个,用逗号隔开

finally使用
有一些特定的代码无论异常是否发生,都需要执行。因为异常会引发程序跳转,导致有些语句执行不到。无法满足这个需
求。异常捕获处理时java提供解决方案,finally就是解决这个问题的,这个代码块中存放的代码都是一定会被执行的。

异常细节

try catch finally 组合方式
try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。异常捕获处理。

void show()//不用throws
{
  try{
    throw new Exception();
  }catch(Exception e)
  {
//处理方式
  }
}

try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理
的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
void show()//需要throws

{
  try{
  throw new Exception();
  }finally
  {
    //关闭资源
  }
}

try catch finally组合:检测异常,并传递给catch处理,并定义资源释放。

发布了70 篇原创文章 · 获赞 56 · 访问量 1991

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/103486621