**

1.异常的概述

**
    在Java程序中,错误可能产生于程序员没有预料到的各种情况,或者是 超出了程序员可控范围的环境因素,如用户的坏数据、试图打开一个根 本不存在的文件等。在Java中这种在程序运行时可能出现的一些错误称 为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
  下面我们先来看一个小例子:
在项目中创建类Baulk,在主方法中定义int型变量,将0 作为除数赋值给该变量。
代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
    运行后我们发现程序运行的结果报告发生了算术异常ArithmeticException(根据给出的错误提示可知发生错误是因为在算术表达式“3/0”中,0作为除数出现),系统不再执行下去,而提前结束。这种情况就是所说的异常。
    有许多异常的例子,如空指针、数组溢出等。Java语言是一门面向 对象的编程语言,因此,异常在Java语言中也是作为类的实例的形式出 现的。当某一方法中发生错误时,这个方法会创建一个对象,并且把它传递给正在运行的系统。这个对象就是异常对象。通过异常处理机制, 可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主 流程的同时在其他地方处理异常。

.
.

2.捕捉异常

    Java语言的异常捕获结构由try、catch和finally 3部分组成。其中, try语句块存放的是可能发生异常的Java语句;catch程序块在try语句块之 后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。
  语法如下:
在这里插入图片描述
通过异常处理器的语法可知,异常处理器大致分为try-catch语句块 和finally语句块。
下面我们分别说一下try-catch语句块 和finally语句块分别是如何捕捉异常的
.

2.1 try-catch语句块

我们在项目中创建类Take,在主方法中使用try-catch语句块 将可能出现的异常语句进行异常处理。
在这里插入图片描述
运行结果如下图所示:
在这里插入图片描述
    从上图可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。在将可能出现异常的代码用try-catch语句块进行处理,当try代码块中的语句发生异常时,程序就会调转到catch代码块中执行,执行完catch代码块中的程序代码后,将继续执行catch代码块后 的其他代码,而不会执行try代码块中发生异常语句后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。

.

2.2 try-catch的注意事项

    注意1:Exception是try代码块传递给catch代码块的变量类型,e是变量名。 catch代码块中语句“e.getMessage();”用于输出错误性质。通常,异常处理常用以下3个函数来获取异常的有关信息。 getMessage()函数:输出错误性质。 toString()函数:给出异常的类型与性质。 printStackTrace()函数:指出异常的类型、性质、栈层次及出现 在程序中的位置。
    注意2:
有时为了编程简单会忽略catch语句后的代码,这样try-catch语句就 成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良 好的编程习惯,最好在catch代码块中写入处理异常的代码。

.
.

2.3 finally语句块

    完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之间的try-catch是否顺利执行完毕,都会执行finally语句。
但在以下4种特殊情况下,finally块不会被执行:
     1 在finally语句块中发生了异常。
     2 在前面的代码中使用了System.exit()退出程序。
      3 程序所在的线程死亡。
     4 关闭CPU。

.
.

3.Java中常见的异常

    在Java中提供了一些异常用来描述经常发生的错误,其中,有的需要程序员进行捕获处理或声明抛出,有的是由Java虚拟机自动进行捕获 处理的。Java中常见的异常类如下表所示。
在这里插入图片描述

.
.

4.自定义异常

    使用Java内置的异常类可以描述在编程时出现的大部分异常情况。 除此之外,用户只需继承Exception类即可自定义异常类。
在程序中使用自定义异常类,大体可分为以下几个步骤:
    (1)创建自定义异常类。
    (2)在方法中通过throw关键字抛出异常对象。
    (3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语 句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给 方法调用者的异常,继续进行下一步操作。

    (4)在出现异常方法的调用者中捕获并处理异常。

    下面我们来展示一下自定义异常的基本语法:
    我们在项目中创建自定义异常。在项目中创建类MyException,该类继承Exception。
在这里插入图片描述
通过上面的操作我们可以发现字符串ErrorMessage是要输出的错误信息。若想抛出用户自定义的 异常对象,要使用throw关键字 (我们下面将讲到throw关键字和throws关键字的具体使用步骤)

.
.

5.在方法中抛出异常

    若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。

.

5.1 使用throws关键字抛出异常

    throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。
    下面我们用实例了解一下throws关键字的使用步骤

    我们在项目中创建类Shoot,在该类中创建方法pop(),在该 方法中抛出NegativeArraySize-Exception异常,在主方法中调用该方法, 并实现异常处理。
在这里插入图片描述
运行结果如下:
在这里插入图片描述使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
     说明:
    如果是Error、RuntimeException或它们的子类,可以不使用throws 关键字来声明要抛出的常,编译仍能顺利通过,但在运行时会被系统抛出。

.

5.2 使用throw关键字抛出异常

     throw关键字通常用于方法体中,并且抛出一个异常对象。程序在到throw语句时立即终止,它后面的语句都不执行。通过throw抛出 异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块。 throw通常用来抛出用户自定义异常。
下面通过实例介绍throw的用法。

在项目中创建自定义异常类MyException,继承类 Exception。
在这里插入图片描述

.
.

6.运行时异常

     RuntimeException异常是程序运行过程中产生的异常。Java类的每个包中都定义了异常类,所有这些类都是Throwable类的子类。 Throwable类派生了两个子类分是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常,如图下图所示。
在这里插入图片描述
.
Java中提供了常见的RuntimeException异常,这些异常可通过trycatch语句捕获,如表下表所示。
在这里插入图片描述

.
.

7.异常的使用原则

    Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:

  1.在当前方法声明中使用try-catch语句捕获异常。
  2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。
  3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。

.
.

8.小结:

    在Java中的异常处理机制中,我们应了解异常的概念、几种常见的异常类,掌握异常处理技术,以及如何 创建、**用户自定义的异常处理器。Java中的异常处理是通过trycatch语句来实现的,也可以使用throws语句向上抛出。建议读者不要将 异常抛出,应该编写异常处理语句。对于异常处理的使用原则也应该理解。

版权声明:本文为匿名原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: