基于java的异常处理技术及其应用内容摘要:

owable类的 printStacktrace方法来获得堆栈结构的文本描叙。 现在,可以通过调用 getStackTrace方法来获得一个 StackTraceElement对象的数组,通过研究该数组,就可以分析程序运行情况。 例如: Throwable t = new Throwable ( )。 StackTraceElement[ ] frames = ( )。 For ( int i= 0。 i。 i++) 使用 StackTraceElement类提供的方法获取文件名以及当前执行的代码行行号的方法,同样,它还提供获取类名 、 方法名的方法。 而 toString方法可以产生一个格式化字符串,其中包含那些获得的信息。 以下程序。 import .*。 import .*。 public class StackTest { /** 返回 n! = 1 * 2 * . . . * n 的结果 */ public static int factorial (int n) { (factorial ( + n + ): )。 Throwable t = new Throwable( )。 StackTraceElement[ ] frames = ()。 for ( int i = 0。 i。 i++ ) ( frames[ i] )。 int r。 if (n = 1) r = 1。 else r = n * factorial(n 1)。 // 递归调用 factorial()方法 (return + r)。 return r。 } 10 public static void main(String[] args) { String input = ( 请输入一个整数 : )。 int n =(input)。 factorial(n)。 ( 0 )。 //退出程序 } } 由于需要从标准输入中获取整数数字, (input)方法可能会产生。 运行程序时界面: 图 3- 1 输入界面 如果我们要实现递归方法 factorial(3),通过 getStackTrace方法可以查看程序运行的过程。 其结果为如下: 图 3- 2 递归方法 factorial(3)的输出结果 而这个程序可能产生的一个异常是 NumberFormatException异常。 当异常产生后, JVM调用该异常处理。 其运行界面如下: 11 图 3- 3 输入一个产生 异常 的 数据 返回到控制台的结果为描述该异常: 图 3- 4 输入异常数据 时在控制台产生的结果 (四)自定义异常 由于在 Java 中 ,异常也被看成是对象 ,而且 异常 和一般的对象没有什么不同。 因此 ,任何类都可以定义它自己的异常 ,并用 throw 语句引发它们。 其中 ,throw 语句由带有一个对象的关键字 throw 组成 ,这个对象应该是 Exception 或其子类的一个实体对象。 要注意的是 ,当执行了一条 throw 语句后 ,就不会执行该语句之后的任何代码了。 通常每 个异常类提供一个默认的构造器以及一个包含详细信息的构造器。 使用Throwable 的 toString 方法会输出该详细信息,这个方法对代码调 试是很有用处。 例如 创建这样的异常类: class FileFormatException extends IOException { public FileFormatException ( ) { } public FileFormatException ( ) { super ( gripe)。 } 12 } String readData ( BufferedReader in ) throws FileFormatException { „„ while ( „„ ) { if ( ch==1) //EOF 标记,即文件结尾 { if (nlen) throw new FileFormatException ( )。 //抛出自定义的异常类 FileFormatException } „„ } return s。 } (五)关于图形界面程序的异常捕获 对于一个非图形界面的程序而言,如果一个异常没有被捕获,则程序会终止运行并且在控制台输出一条包含异常类型以及堆栈内容的信息。 而对于具有图形界面的程序(包含applet以及应用程序),也会输出这些错误信息,但是程序会返回用户界面外层循环中去。 下面我们从一个有趣的程序 颜色调和板来讨论图形界面程序处理异常的情况。 在 (源代码见附录) 中,程序可以根据我们输入红色 、 绿色 、蓝色( RGB) 、 亮度 、 饱和度 和 色度值来调节颜色。 整个程序除了可能会产生RuntimeException异常外,这个程序还会产生 NumberFormatException异常。 当然这是已检查型异常。 下面我们来看它在 JVM中的运行情况: 图 4- 1 输入正常数据时的颜色调和板 13 当我们改变 ”红色 ”值为非法的一个输入,比如: “AB”时,其运行结果为如下: 图 4- 2 输入一个产生异常的数据 颜色未变化,好像程序发生逻辑错误似的(没有按照我们希望的去运行)其实程序已将控制权转到控制中心去了,这个图形还处于初始化阶段(在输入 “AB”前 )。 在控制中心我们发现如下一些异常发生描述: 图 4- 3 异常产生后返回到控制台的说明 这说明发生了 NumberFormatException(数字格式异常)异常后,并没有继续往下执行代码。 由于数字格式异常为已检查型异常,直接调用系统的方法处理了。 JVM报告程序发生了数字格式异常产生,并将其具体的情况报告给用户。 但是,是不是这个程序不能再接受正常的输入数据运行呢。 还是必须要重新启动才能运行。 我们将 “红色 ”值由 “AB”改为 “200”后发现颜色改变,这说明该程序还能运行。 结果如下图: 图 4- 4 将产生异常的输入数据更改后的颜色调和板 可见当输入了正常的数据后,程序就像第一次运行一样,可以正确的显示颜色了。 我 14 们得到的结论是:部分 Java图形界面程序发生异常后不需要重新初始化,依旧可以运行,但必须不再有异常发生。 五 Java 异常处理 基本原则 合理使用 Java异常机制可以使程序健壮而清晰 ,但是 ,Java异常处理机制 也 常常 会 被错误 地 使用 ,下面就讨论一些关于 使用异常 的 原则 : (一 )不要忽略 已检查型异常 注意 下面的代码 : try { method1()。 //method1抛出 Exception A } catch(Exception A) //捕获 Exception A { ( )。 //打印捕获异常 } 上面的代码似乎没有什么问题 ,捕获异常后将异常打印 ,然后继续执行。 事实上在 catch块中对发生的异常情况并没有作任何处理。 虽然程序能够继续执行 ,但是由于这里的操作已经发生异常 ,将会导致以后的操作不能按照预期的情况发展下去 ,可能导致两个结果。 一种情况是这里的异常导致在程序中别的地方抛出一个异常 ,这会使程序 员在调试时感到迷惑 ,因为新的异常抛出的地方并不是程序真正发生问题的地方 ,也不是发生问题的真正原因。 另外一种情况程序继续运行 ,并得出一个错误的输出结果 ,这种问题更加难以捕捉 ,因为很可能把它当成一个正确的输出。 那么应该如何处理呢。 一般 有四个选择 :处理异常 ,进行修复以让程序继续执行。 重新抛出异常 ,在对异常进行分析后发现这里不能处理它 ,那么重新抛出异常 ,让调用者处理。 将异常转换为用户可以理解的自定义异常再抛出 ,这时应该注意不要丢失原 始异常信息。 不要捕获异常。 因此 ,当捕获一个 未检查型异常 时 ,必须对异常进行处理。 如果认为不必要在这里作处理 ,就不要捕获该异常 ,在方法体中声明方法抛出异常 ,由上层调用者来处理该异常。 15 (二 )不要一次捕获所有的异常 我们常见如下关于异常处理的代码 : try { method1()。 //method1抛出 ExceptionA method2()。 //method2抛出 ExceptionB method3()。 //method3抛出 ExceptionC } catch(Exception e) //捕获所有异常 { „„ } 代码中使用一个 catch子句捕获了所有异常 ,看上去很简洁 ,一个代码段就捕获了全部的异常。 但是这里有两个潜在的缺陷 ,一是对 try块中抛出的每种 异常 ,很可能需要不同的处理和恢复措施 ,而由于这里只有一个 catch块 ,分别处理就不能实现。 二是 try块中还可能抛出 RuntimeException,代码中。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。