编写Java程序经常会遇到错误。一类错误是语法错误或资源链接错误,此类错误一般在编译过程中就可以发现;另一类错误是在程序运行过程中出现的错误,该类错误被称为程序异常,由于程序异常严重影响了程序运行的稳定性。因此,程序人员必须要对此类错误进行预防和处理,对异常处理的过程即异常处理。
在工作和现实生活中,也有很多异常处理的事例。例如,在软件项目开发过程中,团队成员的突然离职、客户对需求的变更、开发进度拖延等情况的发生,都会导致项目开发过程出现异常,并需要项目经理及时处理这些异常情况。
异常不可避免,但可以对异常做出预测和预处理,预测什么情况下会出现异常,出现异常后如何处理。
例如,前面谈到的软件项目开发过程出现的异常,可以在项目管理计划书中针对团队成员离职、需求变更、进度拖延出现的异常,制定详尽的应对计划,该应对计划就是异常处理。
对于程序而言,内存溢出、数组越界、除零操作、对象没有实例化就使用、变量无赋值就使用等操作都会引发程序异常。因此,程序员在编写代码时,需要对上面的情况做出预测,并添加出现异常时的处理语句,以提高程序的稳定性。
在不支持异常处理的程序设计语言中,程序员为了检查可能发生的异常情况,需要使用很多的if—else语句,这就要求程序员非常清楚地知道是什么导致了异常的产生,以及异常的确切含义。
案例1:建立一个测试类,使用if-else语句处理程序可能出现的错误。
新建项目PCoreUnit4,在PCoreUnit4项目新建excep包,在excep包下新建ExecpTest类。代码如下:
package excep;
/**
* @ClassName: ExecpTest
* @Description: 异常处理(如何处理程序异常)案例1
* @author 编程训练营
* @date
*
*/
public class ExecpTest {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
int ret = div(20,0);
System.out.println("除法结果为:" + ret);
}
/**
* @Title: div
* @Description: 求两数的除法
* @param @param a
* @param @param b
* @param @return 参数
* @return int 返回类型
* @throws
*/
public static int div(Integer a,Integer b)
{
int ret = -1;
//预测传入参数a为空的异常处理代码
if( a == null )
{
System.out.println("传入的参数a为空");
return ret;
}
//预测传入参数b为空的异常处理代码
else if( b == null )
{
System.out.println("传入的参数b为空");
return ret;
}
//预测传入参数b不能为0的异常处理代码
else if( b == 0 )
{
System.out.println("传入的参数b为0,b做为除数不能为0");
return ret;
}
ret = a / b;
return ret;
}
}程序执行结果如下图所示:
有异常处理机制的语言,没有必要去编写上述的这些if—else语句。在默认的情况下,异常会输出一个错误消息,并中止程序的执行。为了更好地处理异常情况,程序员通常会在程序中定义异常处理语句来捕获和处理异常情况。Java语言提供了try—catch语句来捕获和处理异常,try—catch语句后面会详细讲解。
案例2:使用try—catch语句对上面的案例提供异常处理的支持。
在excep包下新建TryCatchTest类。代码如下:
package excep;
/**
* @ClassName: TryCatchTest
* @Description: 异常处理(如何处理程序异常)案例2
* @author 编程训练营
* @date
*
*/
public class TryCatchTest {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
int ret = div(20,0);
System.out.println("除法结果为:" + ret);
}
/**
* @Title: div
* @Description: 求两数和除法
* @param @param a
* @param @param b
* @param @return 参数
* @return int 返回类型
* @throws
*/
public static int div(Integer a,Integer b)
{
int ret = -1;
//try语句块用于捕获异常
try {
ret = a / b;
}catch(Exception e1){
//catch语句块用于处理异常
System.out.println(e1.getMessage());
}
return ret;
}
}采用try—catch语句不仅可以使代码变得更简洁,而且能为程序调试提供很大的方便,从而达到提高程序稳定性的目的。
异常处理就是提前预测程序可能发生的所有异常情况,并通过Java提供的异常处理类捕获异常,编写异常处理代码。当出现异常后,程序执行的流程发生改变,程序的控制权转移到异常处理代码。