从零开始学Java 第12章 异常处理

第12章  异常处理
世界上没有完美的事情,一个完善的程序不可能总是会准确无误的运行,它们的运行流程都是在开发人员所预料的范围之内。但是,实际却不尽人意。在程序的运行过程中可能会因为各种原因而导致出现错误,例如用户的误操作,各种环境原因等。Java为此提供了异常处理机制。通过这套机制就可以将容错率提高。本章就主要介绍Java的异常处理机制。
12.1  异常
 Java中的异常处理是提前给出程序中有可能会出现的异常,这样就可以通过这种容错机制使程序可以继续正常运行。本小节就主要介绍异常出现的原因、异常的分类。
12.1.1  什么是异常
异常就是在程序运行过程中所出现的不正常现象。例如在做除法运算时,0是不能被除的,这样的事情小学的时候就知道,同样,计算机就会通过异常来将这个信息传出,以此进行说明。
Java中的异常可以通过关键字进行控制,主要有try、catch、throw、throws和finally五个。
try:使用在程序中有可能会出现不正常的地方,此时可以使用try将可能出现异常的代码段包围起来,如果try语句块中出现异常,那么这个异常就会被抛出。
catch:是用来捕获异常,并在这个语句块中对该异常进行处理,例如输出说明语句等。
finally:则是不管发生还是不发生异常,都需要执行。
throw:用来动手引发一个异常。
throws:定义热河被调用方法的异常。
12.1.2  异常出现的原因
在程序正常运行过程中,假如出现了异常,作为一个稳健的程序来说或,首先需要将程序切换到另一个安全的状态,并且需要允许用户可以进行其他的操作;其次是提示用户程序出错的原因,然后保存数据并终止程序。一个程序,至少要做到以上两点之一。
12.1.2  异常出现的原因
如果需要在程序中处理异常情况,就需要确切的知道异常时由何种原因造成的,一般情况下,导致异常出现有以下几种:
1.用户输入错误:用户在需要填入数据的时候,将不符合要求的数据进行添加。例如需要输入一个整型的数据,而用户却输入了一个字符串类型的数据。此时就应当提示用户输入的格式错误,并返回界面重新输入。
2.代码本身错误:进行数据运算时,数据的长度引起的错误,或者是数组越界、算法错误、空引用等问题
3.环境因素:磁盘空间或者内存不足所引起的错误。
异常的出现多种多样,在具体处理异常的时候,应该要判断异常,针对于不同的异常类型采取不同的处理措施。
12.1.2  异常的分类
Java中的异常体系非常庞大,所有的异常最终都是继承自Throwable接口。可以将异常分为运行时的异常和已经检查的异常。Java中主要有三种异常,也就是Throwable中的三个基本子类。
Error:定义Java运行时的内部错误以及资源耗尽错误。表示很难恢复的错误,例如内存越界。一般不期望用户来进行处理。
RuntimeException:用来表示设计或者实现方面的问题,例如数组越界、类型转换错误、去访问一个没有初始化的对象。在出现这个错误的时候,一般不需要处理,运行的时候,环境会输出一条信息语句,提示用户修正错误。
其他异常:表示是运行的时候因环境因素影响可能发生并可以被处理的问题。例如查找不到文件或者是一个不完整的路径等。因为用户的错误很可能就会导致这类问题的发生。
12.2  处理异常
在出现异常的时候,可以直接捕获处理,也可以先不对它进行处理而是把它抛给上面的调用者。本节主要介绍try/catch捕获异常、throws声明异常、throw抛出异常、自定义异常等诸多的内容。
12.2.1  获取异常信息
进行异常处理的时候,可能会将抛出异常的代码放置到try块中,然后创建一个catch语句块,catch语句块中有一个异常类型和一个代表这个类型的对象引用。如果给书被抛出的异常匹配之后,catch块中的语句就会被执行。
12.2.2  异常声明
异常声明就是指一个方法不处理它所产生的异常,而是调用层次向上传递,谁调用的这个方法,这个异常就由谁来进行处理。
12.2.3  抛出异常
Throw语句用在具体方法中抛出异常,它的语法格式如下:
throw exception;
在以上的语句中,throw是关键字,用于抛出异常。参数exception则是表示要抛出的异常对象,该对象应该是throwable类的子类,而且只能够是一个。
12.2.4  异常链
两个或者是多个不同的异常出现在同一个程序中,并且会发生嵌套抛出就是异常链,异常链是一个比较抽象的概念。
12.3  定义自己的异常
前面介绍了一些Java本身自带的一些异常,但是在某些特定的情况下,还需要自己去创建一个异常类型,创建异常类型只需要继承Throwable类或者是它的子类Exception就可以了。本节中就主要介绍一下如何使用自己定义的异常类。
12.3.1  创建自己的异常类
异常的创建非常简单,只需要继承Exception,并实现一些方法就可以了。创建异常的一般形式如语法:
class 类名 extends Exception
{
  //类体
}
12.3.1  创建自己的异常类
Throwable主要的方法如下:
public Throwable fillInStackTrace():该方法的作用就是返回一个包含有完全堆栈追踪的Throwable对象,这个对象可以被再次抛出。
返回包含一个完全堆栈追踪的Throwable对象,这个对象可以被再次抛出。
public Throwable getCause():返回此throwable对象的cause;如果cause不存在或未知,则返回 null。
public String getMessage():返回此throwable对象的详细消息字符串。
public void printStackTrace():将异常堆栈追踪输出到标准错误流。
public void printStackTrace(PrintStream s):将此throwable对象及其追踪输出到指定的输出流。
public void printStackTrace(PrintWriter s):将此throwable对象及其追踪输出到指定的 PrintWriter。
public String toString():返回一个包含异常描述的String对象。
12.3.2  使用自己的异常类
上一小节介绍了如何创建自己的异常类,这以小节将讲解如何使用自己创建的异常类。首先定义了一个异常类IllegalAgeException。AgeTest类则是对年龄进行分类的程序,对各个年龄段的成绩分为不同的名称。其中需要考虑的是,年龄是有范围的,一般在0-100岁之间。当然其中也有一些寿星,所以在此规定年龄超过120则认为是超出范围,则会抛出相应的异常,也就是IllegalAgeException。然后使用该异常进行处理。
12.4  小结
在本章中首先介绍了什么是异常,介绍了Java异常机制的基本体系结构。然后又介绍了Java中异常机制的使用,又对自定义异常类进行了简单讲解。正确的处理各类异常是非常复杂的事情,读者应该在程序编写过程中细细体会才能熟练的掌握,本章只是对Java异常机制的简单介绍,还希望读者能在实践中学习,加深对Java异常机制的认识。

原文地址:https://www.cnblogs.com/yoogoo/p/2467272.html