Java中的异常和处理方式
**
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语句向上抛出。建议读者不要将 异常抛出,应该编写异常处理语句。对于异常处理的使用原则也应该理解。