首页 > 代码库 > 9.0异常处理
9.0异常处理
---恢复内容开始---
在程序中总是存在各种错误,使应用程序在运行时终止。为了在程序执行过程中发生错误时能正常运行,可以使用Java提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行。
异常概述
假如有一辆轿车发生了故障,可能是某个零件发生了问题,也可能是没邮了。如果由于零件问题,只需要更换零件就可以解决问题;如果是没有油了,只需要加满油就可以正常行驶了。程序中的异常与此类似,就对程序中可能发生异常的语句进行处理,使程序能够正常执行。
---恢复内容结束---
在程序开发过程中,可能存在各种错误,有些错误是可以避免的,而有些错误却是意想不到的,在Java中把这些可能发生的错误称为异常。图示说明了异常类的继承关系:
Throwable类是所有异常类的超类,该类的两个直接子类是error和exception。其中,error及其子类用于指示合理的应用程序不应该试图捕获的严重问题,exception及其子类给出了合理的应用程序需要捕获的异常。
从图中可以看出,throwable类是所有异常类的超类,该类的两个直接子类是error和exception。其中,error及其子类用于指示合理的应用程序不应该试图捕获的严重问题,exception及其子类给出了合理的应用程序需要捕获的异常。
注意:图中列出了异常类的继承关系,由于界面大小有限,而error类和exception类的子类又比较多,所以这里使用other subclass代表error类和exception类的子类。
异常的分类
在Java中可以捕获的异常(即exception类的子类)分为可控式异常和运行时异常两种类型。
可控式异常
在Java中把那些可以预知的错误,例如从文件中读取数据、对数据库进行操纵等,在程序编译时就能对程序中可能存在的错误进行处理,并给出具体的错误信息,我们把这些错误称为可控式异常。
注意:由于在构造方法中加载com.mingrisoft包中的test类时,Java虚拟机没有找到test类,从而引发了classnotfoundexception异常,所以在控制台输出了classsnotfoundexception这样的异常信息,由于在执行“class.forname("com.mingrisofr.test");”语句时发生了异常,所以导致程序中的其他代码没有执行,所以在控制台并没有输出“测试”和“888”。
运行时异常
(概念)在Java中有些错误时不能被编译器检测的,例如,在进行除法运算时,除数为零;试图把一个不是由数字组成的字符串使用integer类的parseint()方法转换为整数等,Java的编译器是检测不到的,因而能够正常编译,但是在运行时就会发生异常,我们把这些异常称为运行时异常。表中列出了常用的运行时异常及说明》
注意:上面代码首先创建一个object对象o,该对象是通过object的子类interger创建的,也就是说object对象o是子类interger的实例,因此当使用string类将对象o强制转换为字符串时出错了,因为对象o是object的子类interger创建的,而不是string类创建的,所以产生了错误,如果将对象o强制转换为interger类型就不会出错,因为对象o是interger类创建的。
说明:从输出结果可以看出,程序发生arrayindexoutofboundsexception异常,该异常是indexoutofindexoutofboundsexception异常的子异常,当程序执行到语句“value=http://www.mamicode.com/ex.getnum(6);”时发生了异常,一位数组中有两个元素,数组下标的范围是从0~5,所以用6作为数组下标的索引值发生了错误,因而导致下面的其他语句不会被执行,所以程序中只输出了数组中第一个元素的值100,而没有输出最后一个元素的值60.
获取异常信息
获取异常信息就好比工厂里某个线路出现故障停电了,电工要从线路中找出故障的原因,就像程序中获取到了异常信息。在Java中java.lang.Throwable类是所有异常类的超类,该类提供了获得异常信息的方法。表中列出了获取异常信息的方法及说明:
注意:输出结果是除数为0时发生的异常,其中前3行是printstacktrace()方法输出的异常信息,第4行getmessage()方法输出的异常信息,第5行是getlocalizedmessage()方法输出的异常信息,最后一行是tostring()方法输出的异常信息。在本里的代码中使用了太try……catch语句块来捕获程序中的异常信息,在try和catch之间两个大括号内是程序需要正常执行,但是却又有可能发生异常的代码,在catch后的两个大括号内是try和catch之间的代码发生错误时执行的代码,用于进行异常处理。
异常处理
在Java语言中当程序发生异常时,可以使用try……catch、try……catch……finally或try……finally进行处理。
使用try……catch处理异常
对于程序中可能发生异常的语句,可以将其添加到try……catch语句块中,这样当程序发生异常时,就可以对其进行相应的处理。
try……catch语句块的语法格式如下:
try{需要正常执行的语句}catch(exception ex){对异常进行处理的语句}
try和catch是进行异常处理的关键字。try和catch之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
chatch后的两个小括号内是程序需要处理的异常类型。catch后的两个大括号内是对程序发生的异常进行处理的语句。
使用try……catch……finally处理异常
对于程序中可能发生异常的语句,可以将其添加到try……catch……finally语句块中,这样当程序发生异常时,就可以对其进行相应的处理。
try……catch……finally语句块的语法格式:
try{需要执行的语句}catch(exception ex){对异常进行处理的语句}finally{一定会被处理的语句}
try、catch和finally是进行异常处理的关键字。try和catch之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
catch后的两个小括号内是程序需要处理的异常类型。catch后的两个大括号内是对程序发生的异常进行处理的语句。finally后的两个大括号内的语句,不管程序是否发生异常都要执行(也就是说程序执行完try和catch之间的语句或执行完catch后两个大括号内的语句都将执行finally),因此finally语句块通常用于执行垃圾回收、释放资源等操作。
注意:在Java中进行异常处理时,应该尽量使用finally块进行资源回收,因为在try……catch……finally语句块中,不管程序是否发生异常,最终都会执行finally语句块,因此可以在finally块中添加释放资源的代码。从输出结果可以看出,程序在try语句块中创建了IO对象,然后在finally语句块中关闭了IO对象,释放了内存资源。
使用try……finally处理异常
对于程序中可能发生异常的语句,可以将其添加到try……finally语句块中,这样当程序发生异常时,就可以在finally语句块中当其进行相应的处理,另外当程序没有发生异常时,执行完try和finally之间的语句后,也将执行finally语句块中的代码,因此可以在finally语句块中放置一些必须执行的代码,如释放内存资源的代码。语法格式:
try{需要执行的语句}finally{一定会执行的语句}
try和finally是进行异常处理的关键字。try和finally之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。finally后两个大括号内的语句是不管程序是否发生异常最终都要执行的语句,因此finally语句块通常用于放置程序中必须执行的代码,如关闭数据库连接、关闭IO流等。
注意:在有try……finally语句块的程序中,只要执行了try语句块中的代码,不管try语句块是否发生异常,与该try语句块对应的finally语句块都一定会被执行,因此通常使用finally语句块进行资源释放。说明:从输出结果可以看出,程序在try语句块中穿件了IO对象并分配了内存资源,然后在finally语句块中关闭了IO独享并释放了内存资源。
抛出异常
对于程序中发生的异常,除了可以使用try……catch语句块处理之外,还可以使用throws声明或throw语句抛出异常。
使用throws声明抛出异常
throws通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常进行处理时,就可以在声明方法时使用throws声明抛出的异常,然后在调用该方法的其他方法中对异常进行处理(如使用try……catch语句或使用throw声明抛出异常)。
如果需要使用throws声明抛出多个异常,各异常之间要用逗号隔开。throws声明抛出异常的语法格式如下:
数据类型 方法名(形参列表) throws 异常类1,异常类2,……,异常类{
方法体;
}
数据类型是基本数据类型或或对象类型
方法名时Java语言的合法标识符。
throws是抛出异常的关键字。
异常类是Java语言的异常类或自定义异常类
方法体是该方法需要执行的语句。
使用throws抛出Exception异常。 public void showInfo() throws Exception{fileInputStream in = new FileInputStream("c"/Record.txt");}说明:showInfo()方法使用throws抛出了Exception异常,这样在该方法中创建IO对象时就不会发生异常了,但是必须在调用该方法的其他方法中对Exception异常进行处理,否则调用该方法的其他方法会发生异常。
定义methodName()方法,该方法调用了上面定义的showInfo()方法,并对showInfo()方法抛出的异常进行了处理。注意:methodName()方法调用了showInfo()方法,并对showInfo()方法抛出的Exception异常进行了处理,否则该方法将会出错。
使用throw语句抛出异常
在通常情况下,程序发生错误时系统会自动抛出异常,而有时希望程序自行抛出异常,可以使用throw语句来实现。
throw语句通常用在方法中,在程序中自行抛出异常,使用throw语句抛出的是异常类的实例,通常与if语句一起使用。
throw语句的语法格式如下:throw new Exception("对异常的说明");
throw 是抛出异常的关键字。Exception是异常类(通常使用自定义异常类)。
注意:computeArea()方法根据原的半径计算圆的面积,并且当圆的半径小于0时,使用throw语句抛出异常,由于该方法使用throw语句抛出了异常,所以必须在调用方法时对其进行异常处理,本实例在主方法中使用try……catch语句对其进行了处理。
自定义异常
创建自定义异常类
(应用)创建自定义的异常类需要继承自Exception类,并提供含有一个String类型形参的构造方法,该形参就是异常的描述信息,可以通过getMessage()方法获得。例如:
public class NewException extends EXception{public newException(String s){super(s);}}
注意:上面代码创建了一个自定义异常类NewException,也就是说NewException是自定义异常类的名称,该类继承自Exception类,该类构造方法的形参s是需要传递的异常描述信息,该信息可以通过异常类的getMessage()方法获得。
使用自定义异常类
创建完自定义异常类后,就可以在程序中使用了,使用自定义异常类可以通过throw语句抛出异常。
在项目中创建类,在该类中计算原的面积,设定原的半径不能小于20,如果小于20,则调用自定义异常类NewException,处理程序所发生的异常。
异常的使用原则
在程序中使用异常类,可以捕获程序中的错误,但是异常的使用也要遵循一定的规则。下面是异常类的几项使用原则:
不要过多地使用异常,这样会增加系统的负担。在方法中使用try……catch语句块捕获异常时,要对异常进行处理。
try……catch语句块的范围不要太大,这样不利于对异常的分析。一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常。
小结:介绍Java中的异常处理机制。应了解异常的概念、几种常见的异常类,掌握异常处理技术,以及如何创建、激活用户自定义的异常处理器。Java中的异常处理是通过try……catch语句来实现的,也可以使用throw语句向上抛出。建议不要将异常抛出,应该编写异常处理语句。对于异常处理的原则,也应该理解。
9.0异常处理