第七章 异常处理
主要内容:异常的相关概念、Java采用
什么特殊机制来处理异常,以及Java是如何实现这种机制的。
7.1 异常
(1)计算机系统处理异常(错误)的方法主要有:
系统本身检测、遇到错误时,程序终止运行;
程序员在程序设计中兼顾、检测、处理异常。
(2)Java语言中产生异常的情况主要
1
有:
程序中存在非法操作;
程序员在程序中使用了throw语句引起的异常。
(3)Java语言异常处理机制
将程序运行中的所有错误都看成是一种异常,通过对语句块的检测,一个程序中所有的异常被收集起来,放在程序的某一段中处理。
(4)Java语言采用“Throw-Catch-Try” 的方式来处理异常
throw,即抛出异常,就是指程序检
2
测到一个异常,并且移交给系统的过程;
catch,即捕获异常,是指系统在收
集异常后,根据异常类型,从调用栈查找异常处理指针,并且由此转入相应的异常处理过程;
try就是指启动异常处理。
(5)Java引发异常的途径。异常按照如何throw和catch而作如下分类:
系统引发的异常。
ArrayIndexOutOfBoundsException。
由Java引发的异常。如:
3
OutOfMemoryError。
由Java方法引发的异常。 如:FileNotFound和IOException。
(6)Throwable类
是java.lang包中专门用来处理异常的类。
它有两个子类:Error,Exception。它们分别用来处理两组异常。
错误类用来处理程序运行环境方面的异常。如虚拟机错误、连接错误等。由虚拟机抛出,Java程序不对错误处理。
异常类处理隐式异常(如除数为0、
4
数组下标越界等错误)和显示异常(文件或类没找到等)。由Java程序抛出并处理。
Java语言异常处理类的层次关系:
class java.lang.Throwable
class java.lang.Error class java.awt.AWTError class
java.lang.LinkageError class
java.lang.ClassCircularityError class java.lang.ClassFormatError class
5
java.lang.IncompatibleClassChangeError
class
java.lang.AbstractMethodError class java.lang.IllegalAccessError …… ……
class
java.lang.VirtualMachineError class java.lang.InternalError class java.lang.OutOfMemoryError
class java.lang.Exception
6
class java.awt.AWTException
class
java.lang.ClassNotFoundException
class
java.lang.CloneNotSupportedException class java.io.IOException class java.io.EOFException class
java.io.FileNotFoundException ……
7
class
java.lang.IllegalAcessException
…… class
java.lang.RuntimeException class
java.lang.ArithmeticException class
java.lang.ArrayStoreException class java.lang.ClassCastException class
java.util.EmptyStackException
8
class
java.lang.IllegalArgumentException class
java.lang.IndexOutOfBoundsException
class
java.lang.ArrayIndexOutOfBoundsException
class
java.lang.StringIndexOutOfBoundsException
class
java.lang.NegativeArraySizeException
9
class
java.util.NoSuchElementException class
java.lang.NullPointerException class java.lang.SecurityException 7.2 异常处理
Java语言中,由try-catch-finally语句来实现抛出异常和捕获异常的功能。格式如下: try{
//正常语句体
}catch (异常类1,异常对象1){ //异常处理程序体 1,处理异常对象
10
1的方法
}catch (异常类2,异常对象2){ //异常处理程序体2,处理异常对象
2的方法
}……{ }finally{ //退出程序体 }
(1)抛出和捕获过程 import java.io.*; class ExceptionDemo2 {
public static void main(String
11
args[]) {
try {
FileInputStream fis = new
FileInputStream(\"text\");
int b;
while ((b=fis.read())!=-1)
{
System.out.print(b); }
fis.close(); }
catch(FileNotFoundException e)
{
System.out.println(e); System.out.println(\"message:
12
\"+e.getMessage());
}
catch (IOException e) { System.out.println(e); } } }
(2)finally语句
finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。
不论在try代码块中是否发生了异常事件,finally块中的语句都会被执
13
行。
(3)throws语句
在将异常向上移交给调用该方法的方法处理的情况下,要用throws语句。即用throws语句指定方法可能抛出的异常。
throws语句可以抛出多个异常。 throws语句是和方法的定义结合来声明抛出异常。格式:
方法声名 throws exceptionList; 例如:public int read() throws IOException {„„}
14
(4) throw语句(throw语句导致抛出一
个异常)
若要显示地抛出异常,可使用throw语句。其一般语法:
IOException e=new IOException(); throw e;
假设要引发的异常是IOException,附带错误提示信息“I/O error occured in exceptionMethod”,则代码可以是: throw new IOException (\"I/O error
occured in exceptionMethod\");
对于非运行时的异常,如IOException等,程序中必须要作出处理,或者捕
15
获,或者声明抛出。
对于运行时的异常,如
ArithmeticException,则可不做处理。
7.3 异常处理实例 例1:
import java.io.*; import java.util.*; public class Grades{
public static void main(String argv[]) {
Grades grades = new Grades(); grades.calculateGrades();
16
}
Vector names = new Vector(); Vector marks = new Vector();
public void calculateGrades() { int i;
loadData(\"indata.txt\"); for (i=0; iSystem.out.print(names.elementAt(i));System.out.println(\"\\"+marks.elem
17
entAt(i)); } }
public void loadData(String filename) {
FileReader inputFile; Reader reader; StreamTokenizer st; String aString; int aNumber, next; try {
inputFile=new FileReader(\"indata.txt\"); reader=new
18
BufferedReader(inputFile); st=new
StreamTokenizer(reader);
System.out.println(\"--------------------\");
while((next =
st.nextToken()) != st.TT_EOF) { switch (next) { case st.TT_NUMBER: { aNumber=(int)st.nval;
System.out.println(\"------------------\");
marks.addElement(new
19
Integer(aNumber)); break; }
default: {
aString = st.sval;
System.out.println(aString);
names.addElement(aString); } } }
inputFile.close(); }
catch(IOException e) {
20
System.out.println(\"Reading file has a problem\"); }
finally {
System.out.println(\"This program is over. \"); } } }
21