第五章、异常处理
第一节、异常处理基础
异常(Exception)是指运行时代码序列中产生的异常情况。换句话说,异常是一个运行时错误(runtime error)。在不支持异常处理的计算机语言中,错误必须被手工的检查和处理-----典型的是通过错误代码的运用等等。
一个VB(visual basic)函数(function)的例子:
Private Function ShowMsg(number As Integer) ‘传入Integer类型参数
On Error GoTo ErrHandle ‘ 当出现错误时跳到ErrHandle标签处
‘ VB中使用单引号进行注释
Dim str As String ‘ VB中使用Dim来声明一个变量
Me.MousePointer = vbHourglass ‘设置当前窗口鼠标的形状
str = "Hello World!" ‘ 设置字符串str的值
If (number = 10) Then ‘ 当传入参数等于10时
MsgBox str ‘ 显示str字符串
Else
MsgBox "参数不是10"
End If
On Error GoTo ErrHandle2 ‘第二处错误处理
MsgBox number / i ‘i 没有被初始化,默认值是0
‘这里产生一个除0错误
Exit Function ‘ 退出函数,如果没有此语句就会运行
‘ 紧接着的错误处理的代码
ErrHandle:
Me.MousePointer = vbDefault ‘设置鼠标为默认形状
MsgBox Err.number & Err.Description ‘当函数中出现错误时显示错误编号和描述
Exit Function
ErrHandle2:
Me.MousePointer = vbDefault
MsgBox "这是第二处错误处理!"
End Function
上面是VB中一般的错误处理形式,VB中一般的错误处理代码都是放在函数的最后。
而Java支持异常处理,在Java中,一个异常(Exception)就是一个对象,所有异常类型都是内置类java.lang.Throwable的子类。Throwable类在异常类层次结构的顶层,紧接着Throwable类下面的是把异常分成两个不同分支的子类。一个分支是Exception,一个分支是Error。Exception类用于用户程序可能捕捉的的异常情况,它也是你可以用来创建你自己用户异常类型子类的类。Error类定义了在通常环境下不希望被程序捕获的异常,常用于Java运行时系统来显示与运行时系统本身有关的错误,它们通常是灾难性的致命错误,不是你的程序可以控制的,堆栈溢出是这种错误的一例。
你可以将程序中你认为可能会出现错误的地方加上异常处理。Java异常处理通过5个关键字控制:try、cach、throw、throws和finally。下面介绍try/catch/finally语句,通常形式是:
try{
//这里包含你认为可能会出现错误的代码。
//如无问题则代码会从上到下运行
//代码运行时出错则会抛出异常,
//可以直接用一个throw语句显示抛出异常
//或调用一个抛出异常的方法
}catch(ExceptionType1 exOb){
//异常类型1 处理代码,ExceptionType 是发生异常的类型
}catch(ExceptionType2 exOb){
//异常类型2 处理代码
}
…. // try代码块后可以有多个catch 块
finally{
//这个语句块包含了离开try子句后总要执行的代码
//(1)try块代码顺利执行
//(2)由于break、continue或return语句而将要离开try块
//(3)当上面的catch块处理了异常
//(4)还有未被捕获的异常
// 如果try块中没有调用System.exit()语句,在上面的各种情况下,
// finally代码块一定会被执行。
}
当我第一次看到Java中的try语句时,我只会一些C语言,也没什么编程经验,于是我纳闷了很久,为什么要try(尝试)呢?那么这段代码会不会执行?后来才明白怎么一回事,如果也有初学者不明白的话,你可以将try语句理解成: 尝试执行后面的代码,如果无错误则会顺利通过,否则会寻找与错误匹配的catch语句,然后再执行catch内的错误处理代码。
try后面跟多个catch块时 ,当出现异常,每个catch子句被依次检查第一个匹配的异常类型的子句被执行,其他catch子句被旁路。要注意的是,异常子类必须在它们任何父类之前使用,因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,后面运行子类的catch语句将永远不会到达。而且,Java中不能到达的代码是一个错误。
try 不能单独使用,后面至少跟一 catch 子句或一 finally 子句; try 语句可以被嵌套,也就是说一个 try 代码块内可以包含另一个 try 代码块。每次进入 try 语句,异常的前后关系都会被推入堆栈,如果一个内部的 try 语句不含特殊异常的 catch 处理程序,堆栈将弹出,下一个 try 语句的 catch 处理程序将检查是否与之匹配,这个过程将继续直到一个 catch 语句匹配成功,或者是直到所有的嵌套 try 语句被检查完。如果没有 catch 语句匹配, Java 的运行时系统将处理这个异常。