《java程序错误类型及异常处理[参考]》由会员分享,可在线阅读,更多相关《java程序错误类型及异常处理[参考](12页珍藏版)》请在金锄头文库上搜索。
1、精品文档可编辑版 java 程序错误类型及异常处理程序错误类型及异常处理 一、程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的。程序的设计很少有能够一次完成,没有错误的(不是指 HelloWorld 这样的程序,而是要实现一定的功能,具备一定实用价值的程序), 在编程的过程中由于种种原因,总会出现这样或那样的错误,这些程序的错误就是我们常说的“Bug”,而检测并修正这些错误的方法就是“Debug”(调试)。 基本上所有的集成开发环境都提供了强大的和程序调试功能,在程序进行编译,连接,运行时,会对程序中错误进行诊断。 程序的错误可以抽象分为三类:语法错误、运行错误和逻辑错误。 1、
2、语法错误、语法错误 是指由于编程中输入不符合语法规则而产生的。程序编译就通不过,程序不能运行起来。此类错误最简单,调试起来比较容易程序编译就通不过,程序不能运行起来。此类错误最简单,调试起来比较容易 例如:表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环语句或选择语句的关键字不匹配等。通常,编译器对程序进行编译的过程中,会把检测到的语法错误以 提示的方式列举出来,又称为编译错误。 语法错误的调试,则可以由集成开发环境提供的调试功能来实现,在程序进行编译时,编译器会对程序中的语法错误进行诊断。 编译诊断的语法错误分为 3 中:致命错误、错误和警告。 (1)致命错误:这个错误
3、大多是编译程序内部发生的错误,发生这类错误时,编译被迫中止,只能重新启动编译程序,但是这类错误很少发生,为了安全,编译前最好还是先保存程序。 (2)错误:这个错误通常是在编译时,语法不当所引起的。例如:括号不匹配,变量未声明等。产生这类错误时,编译程序会出现报错提示,我们根据提示对源程序进行修改即可。这类 错误是出现最多的。 (3)警告:是指被编译程序怀疑有错,但是不确定,有时可强行通过。例如:没有加 void 声明的主函数没有返回值,double 数据被转换为 float 类型等。这些警告中有些会导致错误,有 些可以通过。 常规解决方法:此类错误一般程序编译系统会自动提示相应的错误地点和错误
4、原因,比如哪一行代码少了个括号等诸如此类的提示,常见的错误,看懂直接改正即可,如果是看不懂原因,可 以将错误提示信息输入搜索引擎查找一下,一般都能找到具体的解决办法。或者有些编程平台会本身提供一个本地或者在线的信息库,提供详细的错误原因和解决办法,比如微软的.NET 开 发平台。 2、运行错误、运行错误 指程序在运行过程中出现的错误。程序通过语法错误检测,但是运行的时候出现错误,导致程序被迫终止,此类错误有特定的发生条件,因此能够准确的定位错误代码段,因而调试也比较方程序通过语法错误检测,但是运行的时候出现错误,导致程序被迫终止,此类错误有特定的发生条件,因此能够准确的定位错误代码段,因而调试
5、也比较方 便。便。 例如:除法运算时除数为 0 、数组下标越界、文件打不开、磁盘空间不够、数据库连接错误等。 此类错误发生时,编译平台一般也会提示相应的信息,对于常规的错误会有比较精确地提示,但有时提示的错误原因会比较模糊,但因为此类错误一般在程序运行时,只在特定的条件下才会 发生,所以根据错误发生的条件,能够大致判断程序出错的代码段,结合错误的原因,也能比较方便的调试出错误。 3、逻辑错误、逻辑错误 程序运行后,没有得到设计者预期的结果,这就说明程序存在逻辑错误。这种错误在语法上是有效的,但是在逻辑上是错误的。 程序运行了,也没有出错,但是执行出来的结果不是用户想要的,分为两种情况:程序运行
6、了,也没有出错,但是执行出来的结果不是用户想要的,分为两种情况: A、 能够看出错误:比如查询工资大于能够看出错误:比如查询工资大于 5000 的人员名单,却出现了的人员名单,却出现了 3000 的;的; B、 看不出错误,直到因缘际会发现程序肯定出错了,后果很严重:比如进行一个符合大型运算,把某个常数输入错了,最后的结果人工无法判断对错,又以该结果进行其它的运算等等,看不出错误,直到因缘际会发现程序肯定出错了,后果很严重:比如进行一个符合大型运算,把某个常数输入错了,最后的结果人工无法判断对错,又以该结果进行其它的运算等等, 最后发现错了误差过大,就得从头排查错误。最后发现错了误差过大,就得
7、从头排查错误。 例如:使用了不正确的变量,指令的次序错误,循环的条件不正确,程序设计的算法考虑不周全等。通常,逻辑错误也会附带产生运行错误。在一般情况下,编译器在编译程序时,不能检测 到程序中的逻辑错误,也不会产生逻辑错误的提示,因此逻辑错误比较难排除,需要程序员仔细的分析程序,并借助集成开发环境提供的调试工具,才能找到出错的原因,并排除错误。 二、java 的异常处理(错误处理) 程序的错误就是通常的异常,也叫 Exception。 1 / 12 精品文档可编辑版 对于语法错误,java 编译系统在编就能发现检查出错误。 对于逻辑错误,编译系统是无法发现错误的,错误需要人为去发现排除错误。
8、对于运行错误,Java 语言中代表异常时,使用一个专门的类来代表一种特定的异常情况,在系统中传递的异常情况就是该类的对象,所有代表异常的类组成的体系就是 Java 语言中的异常类 体系。 1、java 异常类 Java 的异常是一个对象,所有的异常都直接或间接地继承 Throwable 类。Throwable 类的继承层次结构如下: 为了方便对于这些可传递对象的管理,Java API 中专门设计了 java.lang.Throwable 类,只有该类子类的对象才可以在系统的异常传递体系中进行。该类的两个子类分别是: 1)Error 类 该类代表错误,指程序无法恢复的异常情况程序无法恢复的异常情
9、况。对于所有错误类型以及其子类,都不要求程序进行处理。常见的 Error 类例如内存溢出 StackOverflowError 等。 2)Exception 类 该类代表异常,指程序有可能恢复的异常情况指程序有可能恢复的异常情况。该类就是整个 Java 语言异常类体系中的父类。使用该类,可以代表所有异常的情况。 在 Java API 中,声明了几百个 Exception 的子类分别来代表各种各样的常见异常情况,这些类根据需要代表的情况位于不同的包中,这些类的类名均以 Exception 作为类名的后缀。如果遇 到的异常情况,Java API 中没有对应的异常类进行代表,也可以声明新的异常类来代
10、表特定的情况。 在这些异常类中,根据是否是程序自身导致的异常,将所有的异常类分为两种: a) RuntimeException 及其所有子类 该类异常属于程序运行时异常,也就是由于程序自身的问题导致产生的异常,例如数组下标越界异常 ArrayIndexOutOfBoundsException 等。 该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现语法错误。 b) 其它 Exception 子类 该类异常属于程序外部的问题引起的异常,也就是由于程序运行时某些外部问题导致产生的异常,例如文件不存在异常 FileNotFoundException 等。 2 / 12 精品文档可编
11、辑版 该类异常在语法上强制程序员必须进行处理,如果不进行处理则会出现语法错误。 熟悉异常类的分类,将有助于后续语法中的处理,也使得在使用异常类时可以选择恰当的异常类类型。 2、常见的 error 类 异常类名用途 LinkageError动态链接失败 VirtualMachineError 虚拟机错误 AWTErrorAWT 错误 3、常见运行时异常类 异常类名用途 ArithmeticException数学运算异常,比如除数为零的异常 IndexOutOfBoundsException下标越界异常,比如集合、数组等 ArrayIndexOutOfBoundsException访问数组元素的下
12、标越界异常 StringIndexOutOfBoundsException 字符串下标越界异常 ClassCaseException类强制转换异常 NullpointerException当程序试图访问一个空数组中的元素,或访问一个空对象中的方法或变量时产生的异常。 4、常用的非运行时异常 异常类名用途 ClassNotFoundException 指定类或接口不存在的异常 IllegalAccessException非法访问异常 Ioexception输入输出异常 FileNotFoundException找不到指定文件的异常 ProtocolException网络协议异常 SocketEx
13、ceptionSocket 操作异常 MalformedURLException 统一资源定位符(URL)的格式不正确的异常 3 / 12 精品文档可编辑版 5、Java 的异常处理机制描述如下: 在一个方法的运行过程中,如果发生了异常, 则这个方法(或者是 Java 虚拟机)生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并 把它提交给运行时系统的过程称为抛出抛出(throw)一个异常一个异常。 运行时系统寻找相应的代码来处理这一异常,系统在方法的调用栈中查找,从产生异常的方法开始进行回朔,沿着被调用的顺序往
14、前寻找,直到找到包含相应异常处理的方法为止。其过程如 图 10-1 所示。这一过程称为捕获捕获(catch)一个异常。 如该异常未进行成功捕获,则程序将终止运行。 5、异常捕获和处理异常捕获和处理 格式:格式: try 正常程序段,可能抛出异常; catch (异常类 1 异常变量) 捕捉异常类 1 有关的处理程序段; catch (异常类 2 异常变量) 捕捉异常类 2 有关的处理程序段; finally 一定会运行的程序代码; l try 块捕获异常:用于监控可能发生异常的程序代码块是否发生异常,如果发生异常,Try 代码块将抛出异常类所产生的对象并立刻结束执行,而转向异常处理 catch
15、 部分。 对于系统产生的异常或程序块中未用 try 监控所产生的一场,将一律由 java 编译系统自动将异常对象抛出。 l catch 块处理异常 :抛出的异常对象如果属于 catch 内所定义的异常类,则 catch 会捕获该异常,并进入 catch 中的对应代码段继续运行程序,如果异常对象不属于 catch 中所定义的异 常类,则进入 finally 块继续运行程序。 Catch 包括两个参数:一个是类名,指出捕获的异常类型,必须使 Throwable 类的子类;一个是参数名,用来引用被捕获的对象。Catch 块所捕获的对象并不需要与它的参数类型精确匹配, 它可以捕获参数中指出的异常类的对
16、象及其所有子类的对象 l finally 块最终处理:无论是否发生异常都会执行的语句块。比如执行关闭打开的文件、删除临时文件,关闭数据库连接等操作。 注意:注意: l 一个一个 try、catch、finally 块之间不能插入任何其它代码块之间不能插入任何其它代码 l catch 可以有多个,可以有多个,try 和和 finally 只能有一个只能有一个 l try 后面必须要跟后面必须要跟 catch、finally 其中的一个,即但一个其中的一个,即但一个 try、catch、finally 语句只能省略语句只能省略 catch、finally 中的一个。中的一个。 4 / 12 精品文档可编辑版 定义多个 catch 可精确地定位 java 异常。如果为子类的异常定义了特殊的 catch 块,而父类的异常则放在另外一个 catch 块中,此时,必须满足以下规则:子类