第五章Java的异常处理.ppt
《第五章Java的异常处理.ppt》由会员分享,可在线阅读,更多相关《第五章Java的异常处理.ppt(70页珍藏版)》请在三一办公上搜索。
1、第五章 Java的异常处理,为什么要异常处理?,对于任何语言的程序设计而言,错误的发生总是不可避免的.比如说:用户输入出错 所需文件找不到 运行时磁盘空间不够 内存耗尽无法进行类的实例化 算术运算错(数的溢出,被零除)数组下标越界 JVM崩溃 当Java程序出现以上的错误时,就会在所处的方法中产生一个异常对象。这个异常对象包括错误的类型,错误出现时程序的运行状态以及对该错误的详细描述。下面我们先看一个简单的例子。,例5.1public class ExceptionDemo public static void main(String args)int x=100;System.out.pri
2、ntln(The result is+x/10);System.out.println(Divided by zero:+x/0);,当我们对其编译后运行时,其对应的结果如下:其意思是说,本程序执行到语句“System.out.println(Divided by zero:+x/0)”时,系统会抛出一个例外,该例外在Java中定义为Arithmetic Exception(即属于算术运算例外)。,c:jbuilder3javabinjava Exception DemoThe result is10Exception in thread main java.lang.Arithmetic E
3、xception:/by zero at Exception Demo.main(Exception Demo.java:5),5.1 什么是异常,异常(Exception)又称为例外,是指在程序运行过程中发生的非正常事件,它会中断指令的正常执行,影响程序的正常运行。,异常对象,在Java语言中,我们用异常对象来表示不同的异常。所谓Java异常对象就是一个存放着相关错误信息的对象,如果方法运行时产生了异常,该方法就可以抛出一个异常对象为了表示不同种类的异常,Java语言中定义了许多异常类。,异常处理的一般步骤:异常抛出异常捕获异常处理,5.2 异常处理机制,异常处理机制,在Java程序的执行过
4、程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。,异常处理机制,当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。,方法的调用堆栈,Java程序在执行的过程中,形成了一个先进后出的调用堆栈,各方法之间依照调用先后的不同,由先至后的进入调用堆栈,堆栈的最上层即是当前被调用执
5、行的方法。该方法执行完毕后,会将处理器控制权交还给调用他的方法,依此类推。,方法调用堆栈中异常对象的传递,当某一方法中的一个语句抛出一个异常时,如果该方法中没有处理该异常的语句,那么该方法就会中止执行,并将这个异常传递给堆栈中的下一层方法,直到某一方法中含有处理该异常的语句为止。如果该异常被传递至主方法,而主方法中仍然没有处理该异常的语句,则异常将会被抛至JVM,程序中断。,调 用,传 递,例 程,public class ExampleOfException String lines=The first line,The second line,The last line;public st
6、atic void main(String args)ExampleOfException eoe=new ExampleOfException();eoe.methodA();System.out.println(Program finished.);void methodA()methodB();void methodB()methodC();void methodC()for(int i=0;i4;i+)System.out.println(linesi);,The first lineThe second lineThe last lineException in thread mai
7、n java.lang.ArrayIndexOutOfBoundsException:3 at ExampleOfException.methodC(ExampleOfException.java:16)at ExampleOfException.methodB(ExampleOfException.java:12)at ExampleOfException.methodA(ExampleOfException.java:9)at ExampleOfException.main(ExampleOfException.java:6),Java中的异常类,在Java语言中,任何的异常对象都是Thr
8、owable类的直接子类或间接子类的实例。Java的类库已经提供了一些常见的异常类,如果这些异常类不能够满足要求,用户也可以创建自己的异常类。,异常(Throwable)分类,Error动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类异常,也不会抛出这种异常。Exception运行时异常继承于RuntimeException。Java编译器允许程序不对它们做出处理。非运行时异常除了运行时异常之外的其他由Exception继承来的异常类。Java编译器要求程序必须捕获或者声明抛出这种异常。,Error类,Error类表示Java运行时产生的系统内部错误或资源耗尽等严重错误。这种错误通常
9、是程序无法控制和解决的,如果发生这种错误,通常的做法是通知用户并中止程序的执行。,典型的错误类,NoClassDefFoundErrorOutOfMemoryErrorVirtualMachineError。,表5.1 Java常见错误列表,Exception类,Exception的子类表示了不同类型的异常,例如RuntimeException表示运行时异常,而IOException表示I/O问题引起的异常。这些子类也可以被继承以对不同类型的异常进行细分,如RuntimeException还可细分为NullPointerException、ArithmeticException等;IOExce
10、ption还可细分为FileNotFoundException、EOFException等。,典型的异常类,ArithmeticExceptionArrayIndexOutOfBandsExceptionIOExceptionFileNotFoundExceptionNullPointerExceptionNumberFormatException,表5.2 Java常见的一般异常列表,表5.3 Java常见的运行异常列表,必检异常与非必检异常,RuntimeException类及其子类被称为“运行时异常”一般发生在JRE内部也称“非必检异常”如NullPointerException其他异常
11、被成为“非运行时异常”一般发生在JRE外部也称“必检异常”如IOException,5.3 异常类的使用,要捕获一个异常,程序员只需要在程序中设置一个try/catch块,其格式如下:try 抛出异常的代码 catch(某Exception类型 e)处理该异常类型的代码 catch(某Exception类型 e)处理该异常类型的代码,try捕获异常的第一步是用try选定捕获异常的范围,由try所限定的代码块中的语句在执行过程中可能会生成异常对象并抛出。,catch 每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所
12、能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参数值把被抛出的异常对象传递给catch块.在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。,异常的捕获过程,当try块中的某条代码抛出异常时:首先,自该语句的下一条语句起的所有try块中的剩余语句将被跳过不予执行;其次,程序执行catch子句进行异常捕获,异常捕获的目的是进行
13、异常类型的匹配,并执行与所抛出的异常类型相对应的catch子句中的异常处理代码。,异常的捕获过程,需要注意的是:如果try块中没有任何的异常抛出,则所有的catch子句将会被跳过;如果try块中所抛出的异常对象类型与所有的catch子句中的所声明的异常类型都不匹配,则方法会立即中止,并将该异常对象继续抛出,沿调用堆栈传递。,example,public class ExampleOfException String lines=The first line,The second line,The last line;public static void main(String args)Exa
14、mpleOfException eoe=new ExampleOfException();eoe.methodA();System.out.println(Program finished.);.void methodC()for(int i=0;i4;i+)try System.out.println(linesi);catch(ArrayIndexOutOfBoundsException e)System.out.println(Re-setting Index Value);,example,上面的例子中可能会产生数组越界异常,所以将其置于try块中,并在catch子句中对ArrayIn
15、dexOutOfBoundsException类型的异常进行捕获,并进行处理。如果try块中可能抛出多个类型的异常,程序员可以使用多个catch子句对这些异常进行捕获,每种异常类型对应一个单独的catch子句。需要注意的是,这些catch子句是顺序执行的。这意味着,异常对象总是被第一个catch子句首先捕获,如果类型不匹配,才会执行下一个catch子句。读者可以试着分析下面的程序片断,看看有什么样的问题存在。,问题,Java运行系统从上到下分别对每个catch语句处理的例外类型进行检测,直到类型匹配为止;catch语句的排列顺序应该是从子类到父类,try catch(Exception e)c
16、atch(IOException e)catch(ArrayIndexOutOfBoundsException e),catch语句的顺序,捕获异常的顺序和不同catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。,finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。,finall
17、y,finally子句的一般格式:,try 抛出异常的代码 catch(某Exception类型 e)处理该异常类型的代码 catch(某Exception类型 e)处理该异常类型的代码 finally 最后一定会被执行的代码,finally,不论try块中的代码是否抛出异常及异常是否被捕获,finally子句中的代码一定会被执行:如果try块中没有抛出任何异常,当try块中的代码执行结束后,finally中的代码将会被执行;如果try块中抛出了一个异常且该异常被catch正常捕获,那么try块中自抛出异常的代码之后的所有代码将会被跳过,程序接着执行与抛出异常类型匹配的catch子句中的代码,
18、最后执行finally子句中的代码。如果try块中抛出了一个不能被任何catch子句捕获(匹配)的异常,try块中剩下的代码将会被跳过,程序接着执行finally子句中的代码,未被捕获的异常对象继续抛出,沿调用堆栈顺序传递。,问题,当调用上述方法m()时,try块中包含方法的return语句,返回值为1。然而,实际调用该方法后产生的返回值为0。这是因为在方法实际返回并结束前,finally子句中的内容无论如何要被执行,所以finally子句中的return语句使得该方法最终实际返回值为0。,public int m()try return 1;finallyreturn 0;,example,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 Java 异常 处理
链接地址:https://www.31ppt.com/p-5996517.html