99网
您的当前位置:首页Java语言程序设计讲义-第七章

Java语言程序设计讲义-第七章

来源:99网
第七章 异常处理

主要内容:异常的相关概念、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

因篇幅问题不能全部显示,请点此查看更多更全内容