毕业设计基于java的异常处理技术及其应用

上传人:沈*** 文档编号:102975986 上传时间:2022-06-07 格式:DOC 页数:26 大小:444KB
返回 下载 相关 举报
毕业设计基于java的异常处理技术及其应用_第1页
第1页 / 共26页
毕业设计基于java的异常处理技术及其应用_第2页
第2页 / 共26页
毕业设计基于java的异常处理技术及其应用_第3页
第3页 / 共26页
点击查看更多>>
资源描述
目 录一 引言1二 关于JDK和JAVA异常2一Java异常定义2二Java中的异常类2三Java语言标准对异常处理的要求4三 JAVA异常的处理机制4一Java异常处理机制具体实现4二Java中异常发生的原因6三Java异常处理的优点6四 JAVA异常处理技术及其应用8一抛出异常8二捕获异常8三堆栈帧9四自定义异常11五关于图形界面程序的异常捕获12五 JAVA异常处理根本原那么14(一)不要忽略已检查型异常14(二)不要一次捕获所有的异常15(三)使用finally块释放资源16(四)异常不能影响对象的状态17(五)注意丧失或忽略的异常17(六)不要同时使用异常机制和返回值来处理异常20(七)不要让try块过于庞大21六 结束语21致谢21参考文献22附录、源代码22基于Java的异常处理技术及其应用摘 要 本文以Java软件开发工具箱作为环境,通过与一些编程语言的错误处理相比拟,介绍了Java中异常处理技术的由来、定义、标准和Java内建的异常类,讨论了Java中异常产生的原因、实现,还对Java异常处理机制的优点进行了简述,就Java异常处理技术从抛出异常、捕获异常、堆栈帧、自定义异常、图形界面程序异常捕获五个方面进行了讨论。本文还就Java异常处理技术的应用做了一些探讨,试图从软件开发者的角度说明Java异常处理技术在开发中一些有价值的应用。关键词 Java语言 Java异常处理 JVM 一 引言在程序设计中,尽管编写检查和处理错误的程序代码很乏味,并且它们使程序源代码显得冗长,但是,错误检测和处理仍是任何健壮应用程序最重要的组成局部之一。传统的异常处理多采用返回值来标识程序中出现的异常情况,这是程序员熟悉的一种方式,但却有很多缺点。首先,一个APIApplication Programming Interface 应用编程接口可以返回任意的返回值,而这些返回值本身并不能解释是否代表一个异常情况发生或者发生异常的具体情况,需要调用API的程序自己判断并解释返回值的含义。其次,它并没有一种机制来保证异常情况一定会得到处理,调用程序可以简单地忽略该返回值,从而需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长, 当进行容易出现异常情况的处理时,比方:I/O操作,程序中会出现很大的局部用于处理异常情况的switch分支,程序代码的可读性变得很差。相对于传统异常处理方式的缺点,Java异常处理机制提供了很好的解决方案。Java异常处理使开发人员不用编写特殊代码检测返回值就能够很容易地检测错误,并且把异常处理代码和异常产生代码明确地分开,通过抛出Java预定义或者自定义的异常,能够说明程序中出现了什么样的异常情况1;而且Java的语言机制保证了异常一定会得到恰当的处理,合理地使用异常处理机制,会让程序代码更清晰。 二 关于JDK和Java异常一Java异常定义 早期的编程语言比方C语言没有异常处理,通常是遇到错误返回一个特殊的值或设定一个标志,并以此判断是不是有错误产生。随着系统规模的不断扩大,这种错误处理已经成为创立大型可维护程序的障碍了。于是在一些语言中出现了异常处理机制,比方在Basic中的异常处理语句“on error goto,而Java那么是在C+根底上建立了新的异常处理机制。Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。这种机制为复杂程序提供了强有力的控制方式。同时这些异常代码与“常规代码别离,增强了程序的可读性,编写程序时也显得更灵活。 在编译时没有问题的Java源程序,在运行期可能还会发生错误,这种错误就称为异常Exception。异常也可认为是程序运行过程中违背正常指令流而产生的事件2。二Java中的异常类在Java中,所有的异常都是以类对象的形式存在的。每个异常都是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理3。Throwable是所有异常的基类,程序中一般不会直接抛出Throwable对象,Exception和Error是Throwable的子类,Exception下面又有RuntimeException和一般的Exception两类。可以把Java异常分为三类:第一类是Error,Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能终止运行,例如Java虚拟机JVM出现错误。在EJBEnterprise JavaBean中将此类归为JVM 异常,这种类型的异常由 JVM 抛出。Error是一种uncheckedException未检查型异常,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常;一般情况下,在程序中也不应该抛出Error类型的异常。第二类是RuntimeException,在EJB也称为系统异常。RuntimeException是一种未检查型异常,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获未检查型异常,也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。ThrowableErrorExceptionRuntimeExceptionIOException 图21 Java异常类层次图第三类是一般的checkedException, 即已检查型异常。在EJB中称为应用程序异常。已检查型异常是在编程中使用最多的异常,所有继承自Exception并且不是RuntimeException的异常都是已检查型异常,如图2-1中为Java异常的类层次图。都声明有标准异常类。这些异常类以未检查型异常类和已检查型异常类可分为如下:已检查型异常类主要有:1在java.lang中:ClassNotFoundException:指定名字的类或接口没有被发现。CloneNotSupportedException:克隆一个没有实现Cloneable接口的类。IllegalAccessException:试图使用给出了完全路径信息的字符串加载一个类,但当前正在执行的方法无法访问指定的类,原因是该类不是public类或是在另一个包中。InstantiationException:试图使用Class的newInstance方法创立一个对象实例,但是,指定的对象没有被实例化,因为它是一个接口、抽象类或者一个数组。InterruptedException:当前的线程正在等待,而另一个线程那么使用了Thread的interrupt方法中断了当前线程。2在Java.io中:IOException:申请I/O操作没有成功。EOFException:在输入操作正常结束前遇到了文件结束符。FileNotFoundException:在文件系统中,没有找到由文件名字符串指定的文件。InterruptedIOException当前线程正在等待I/O操作的完成,而另一个线程使用thread的interrupt方法中断了当前线程。未检查型异常类主要有:1在java.lang中:ArithmeticException:表示遇到了算术的异常问题,例如0作为除数。ArrayStoreException:试图把与数组类型不相符的值存入数组。ClassCastException:试图把一个对象的引用强制转换为不适宜的类型。InderOutOfBoundsException:数组的下标越界。NullPointerException:试图使用一个空的对象引用。SecurityException:检测到了违反平安的行为。2在java.util中:EmptyStaceException:试图访问一个空堆栈中的一个元素。NoSuchElementException:试图访问一个空向量中的元素。三Java语言标准对异常处理的要求Java语言规定必须对已检查型异常作处理,编译器会对此作检查,要么在方法体中声明抛出已检查型异常,要么使用catch语句捕获已检查型异常进行处理,不然不能通过编译2。已检查型异常用于以下环境:1)该异常发生后是可以被恢复的,如一个Internet连接发生异常被终止后,可以重新连接再进行后续操作。2)程序依赖于不可靠的外部条件,该依赖条件可能出错,如系统I/O。3)该异常发生后并不会导致程序处理错误,进行一些处理后可以继续后续操作。Java语言标准中将任何Error的子类以及RuntimeException的子类都称为未检查型异常。而其它异常都称为已检查型异常。三 Java异常的处理机制一Java异常处理机制具体实现在Java程序运行出现异常时,发生异常的程序段要抛出异常,而运行系统负责寻找一段代码来处理异常。Java语言中,创立一个异常对象并将它交给运行系统称为抛出一个异常,又称为异常抛出。在Java中,一个方法要抛出异常,必须遵循一定的规定,即所谓的“异常标准。异常标准采用了一个额外的关键字:throws。要使方法抛出异常,应在方法声明中,位于参变量列表的后面即throws后面列举全部潜在的异常类型。假假设Java中的某方法可能抛出一个异常,但程序中没有对其进行控制,编译器会侦测到这个情况,通知程序员必须在此方法内进行异常控制,或者从方法里抛出一个异常。通过遵守异常标准,Java可在编译期保证异常处理的正确性。当Java抛出一个异常,程序将从导致异常的代码处跳出,JVM检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序, 如果没有找到处理该异常的catch块,try块中发生异常的代码不会被重新执行,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被终止。Java异常处理的语句形式如下:try/正常执行的代码可能产生异常throw(异常类1 e,异常类2 e,异常类n e)catch(异常类1 e)/异常类1的处理代码catch(异常类2 e)/异常类2的处理代码catch(异常类n e)/异常类n的处理代码finally/执行去除工作的语句Java程序运行在try块中,如果产生了异常,那么不再运行try块下面的语句,而直接进入catch块中,寻找第一个与之匹配的异常类型。try/catch语句会自动在try块后面的各个catch块中,找出与该异常类相匹配的参数。如果该参数符合以下三个条件之一时,那么认为这个参数与产生的异常相匹配4。(1)参数与产生的异常属于同一个类。(2)参数是产生异常的父类。(3)参数是一个接口,产生的异常实现了这一个接口。当产生的异常找到了第一个与之相匹配的参数时,就执行这一参数的catch块中的Java代码。执行完catch块后,程序恢复执行,但不会回到异常发生处继续执行而是执行try/catch结构后面的代码。finally语句可以说是为异常处理事件提供的一个清理机构。一般是用来关闭文件或者释放其他的系统资源作为try/catch/finally结构的一局部,可以没有finally块。如果存在finally块,无论try块中是否发生异常,是否执行过catch块,都要执行finally块。用finally块的一个好处,就是把方法中所有去除状态和关闭系统文件的语句放在一起,不但防止代码的重复,更是减少出现遗漏语句,对于程序以后的修改也较为集中和方便。二Java中异常发生的原因异常发生有三种原因:1Java虚拟机检测到了非正常的执行状态,这些状态可能由三种因素之一引起:表达式的计算违背了Java语言的语义,例如:数组越界、除数为0等。在载入和链接Java程序时出现错误。超出了系统的资源限制,例如使用了太多的内存这些无法预知的异常。2Java程序代码中的throw语句被执行。3发生异步异常,其可能的原因有Thread类的stop方法被调用;JVM内部发生错误;运行时库出现了内部错误等。三Java异常处理的优点在面向过程的传统语言中对程序中可能出现的错误一般采取:查错、报错和排错的处理错误代码和常规代码混杂在一起的方法。比方在C语言面向过程的一种编程语言中输出流的处理伪代码是:建立一个文件输入流;if(建立不成功) 报错;处理错误;else 从输入流中读入一个字符; if(读入不成功) 报错;处理错误;关闭该文件的输入流if(关闭不成功) 报错;处理错误; else else 经过这样的处理,程序可以保证正常地运行。但是程序的每一步都要考虑是否会发生错误,出现了错误又该如何处理的问题。这不但使程序代码的行数大大增加,而且,处理错误代码和正常代码混杂在一起,使程序流程变得十分复杂,不利于阅读。此外,它对于同一类型的错误也不方便进行统一的处理。于上面等价实现地面向对象语言处理异常的伪代码为:try 建立一个文件输入流;读取一个字符;.;关闭该输入流;catch( 文件输入流翻开失败 ) 报错;处理错误;.; catch( 读入字符失败 ) 报错;处理错误;.面向对象语言的异常处理对于面向过程语言处理错误的方法有三种好处:其一将处理错误代码和正常代码别离;其二能够将异常沿着调用堆栈向上传播;其三能按异常类型和异常对象分组。四 Java异常处理技术及其应用一抛出异常如果有一个现成或者已定义的异常可以使用,那么抛出异常很容易。只要满足以下三点:1找到一个恰当的异常类2构造一个该类的实例3抛出该实例比方我们经常遇到IOException异常发生,其中它的一个子类是EOFException,就是描述在输入过程中碰到一个未预期的文件结尾标志,我们抛出该异常的方法如下:throw new EOFException ( );或者这样:EOFException e = new EOFException ( );throw e ;二捕获异常 要想捕获一个异常,需要设置一个try/catch的代码块。try块的最简单形式如下: try codemore codecatch (ExceptionType e ) handler for this type如果try块内的任何代码抛出了由catch块中指定的异常,那么程序跳过try块中的其它代码,程序执行catch块中的处理代码。假设try块没有任何代码抛出异常,那么程序会直接跳过catch块的内容。当然,可以在try块同时捕获多个异常,并分别对每种类型加以不同的处理。三堆栈帧在前,通过使用Throwable类的printStacktrace方法来获得堆栈结构的文本描叙。现在,可以通过调用getStackTrace方法来获得一个StackTraceElement对象的数组,通过研究该数组,就可以分析程序运行情况。例如:Throwable t = new Throwable ( );StackTraceElement frames = t.getStackTrace ( );For ( int i= 0;iframes.length;i+) 使用StackTraceElement类提供的方法获取文件名以及当前执行的代码行行号的方法,同样,它还提供获取类名、方法名的方法。而toString方法可以产生一个格式化字符串,其中包含那些获得的信息。以下程序输出一个递归调用方法的堆栈情况。import java.util.*;import javax.swing.*;public class StackTest /* 返回 n! = 1 * 2 * . . . * n 的结果 */ public static int factorial (int n) System.out.println (factorial ( + n + ): ) ; Throwable t = new Throwable( ); StackTraceElement frames = t.getStackTrace(); for ( int i = 0 ;i frames.length; i+ ) System.out.println( frames i ); int r ; if (n = 1) r = 1; else r = n * factorial(n - 1); / 递归调用factorial方法 System.out.println(return + r); return r; public static void main(String args) String input = JOptionPane.showInputDialog( 请输入一个整数: ); int n =Integer.parseInt(input); factorial(n); System.exit( 0 ); /退出程序 由于需要从标准输入中获取整数数字,Integer.ParseInt(input)方法可能会产生异常。运行程序时界面:图31 输入界面如果我们要实现递归方法factorial(3),通过getStackTrace方法可以查看程序运行的过程。其结果为如下: 图32 递归方法factorial(3)的输出结果而这个程序可能产生的一个异常是NumberFormatException异常。当异常产生后,JVM调用该异常处理。其运行界面如下:图33 输入一个产生异常的数据返回到控制台的结果为描述该异常:图34 输入异常数据时在控制台产生的结果四自定义异常由于在Java中,异常也被看成是对象,而且异常和一般的对象没有什么不同。因此,任何类都可以定义它自己的异常,并用throw语句引发它们。其中,throw语句由带有一个对象的关键字throw组成,这个对象应该是Exception或其子类的一个实体对象。要注意的是,当执行了一条throw语句后,就不会执行该语句之后的任何代码了。通常每个异常类提供一个默认的构造器以及一个包含详细信息的构造器。使用Throwable的toString方法会输出该详细信息,这个方法对代码调试是很有用处。例如创立这样的异常类:class FileFormatException extends IOException public FileFormatException ( ) public FileFormatException ( ) super ( gripe) ; String readData ( BufferedReader in ) throws FileFormatException while ( ) if ( ch=-1) /EOF标记,即文件结尾 if (nlen) throw new FileFormatException ( ); /抛出自定义的异常类FileFormatException return s; 五关于图形界面程序的异常捕获对于一个非图形界面的程序而言,如果一个异常没有被捕获,那么程序会终止运行并且在控制台输出一条包含异常类型以及堆栈内容的信息。而对于具有图形界面的程序包含applet以及应用程序,也会输出这些错误信息,但是程序会返回用户界面外层循环中去。下面我们从一个有趣的程序-颜色调和板来讨论图形界面程序处理异常的情况。在源代码见附录中,程序可以根据我们输入红色、绿色、蓝色RGB、亮度、饱和度和色度值来调节颜色。整个程序除了可能会产生RuntimeException异常外,这个程序还会产生NumberFormatException异常。当然这是已检查型异常。下面我们来看它在JVM中的运行情况:图41 输入正常数据时的颜色调和板当我们改变红色值为非法的一个输入,比方:“AB时,其运行结果为如下:图42 输入一个产生异常的数据颜色未变化,好似程序发生逻辑错误似的没有按照我们希望的去运行其实程序已将控制权转到控制中心去了,这个图形还处于初始化阶段在输入“AB前。在控制中心我们发现如下一些异常发生描述:图43 异常产生后返回到控制台的说明 这说明发生了NumberFormatException数字格式异常异常后,并没有继续往下执行代码。由于数字格式异常为已检查型异常,直接调用系统的方法处理了。JVM报告程序发生了数字格式异常产生,并将其具体的情况报告给用户。但是,是不是这个程序不能再接受正常的输入数据运行呢?还是必须要重新启动才能运行?我们将“红色值由“AB改为“200后发现颜色改变,这说明该程序还能运行。结果如下列图:图44 将产生异常的输入数据更改后的颜色调和板可见当输入了正常的数据后,程序就像第一次运行一样,可以正确的显示颜色了。我们得到的结论是:局部Java图形界面程序发生异常后不需要重新初始化,依旧可以运行,但必须不再有异常发生。五 Java异常处理根本原那么合理使用Java异常机制可以使程序健壮而清晰,但是,Java异常处理机制也常常会被错误地使用,下面就讨论一些关于使用异常的原那么:(一)不要忽略已检查型异常注意下面的代码:try method1(); /method1抛出Exception Acatch(Exception A) /捕获Exception Ae.rintStackTrace( ); /打印捕获异常上面的代码似乎没有什么问题,捕获异常后将异常打印,然后继续执行。事实上在catch块中对发生的异常情况并没有作任何处理。虽然程序能够继续执行,但是由于这里的操作已经发生异常,将会导致以后的操作不能按照预期的情况开展下去,可能导致两个结果。一种情况是这里的异常导致在程序中别的地方抛出一个异常,这会使程序员在调试时感到迷惑,因为新的异常抛出的地方并不是程序真正发生问题的地方,也不是发生问题的真正原因。另外一种情况程序继续运行,并得出一个错误的输出结果,这种问题更加难以捕捉,因为很可能把它当成一个正确的输出。那么应该如何处理呢?一般有四个选择:处理异常,进行修复以让程序继续执行;重新抛出异常,在对异常进行分析后发现这里不能处理它,那么重新抛出异常,让调用者处理;将异常转换为用户可以理解的自定义异常再抛出,这时应该注意不要丧失原始异常信息;不要捕获异常。因此,当捕获一个未检查型异常时,必须对异常进行处理;如果认为不必要在这里作处理,就不要捕获该异常,在方法体中声明方法抛出异常,由上层调用者来处理该异常。(二)不要一次捕获所有的异常我们常见如下关于异常处理的代码:trymethod1(); /method1抛出ExceptionAmethod2(); /method2抛出ExceptionBmethod3(); /method3抛出ExceptionCcatch(Exception e) /捕获所有异常 代码中使用一个catch子句捕获了所有异常,看上去很简洁,一个代码段就捕获了全部的异常。但是这里有两个潜在的缺陷,一是对try块中抛出的每种异常,很可能需要不同的处理和恢复措施,而由于这里只有一个catch块,分别处理就不能实现。二是try块中还可能抛出RuntimeException,代码中捕获了所有可能抛出的RuntimeException而没有作任何处理,掩盖了编程的错误,会导致程序难以调试。我们应该处理为以下的代码:trymethod1();method2();method3();catch (ExceptionA e)/分别捕获和处理三种异常 catch (ExceptionB e) catch (ExceptionC e) (三)使用finally块释放资源关键字finally保证程序使用任何方式离开try块,finally块中的语句都会被执行。当程序中使用了外界资源,如数据库连接、文件等,将释放这些资源的代码写入finally块中是很好的处理方式。必须注意的是,在finally块中不能抛出异常。Java异常处理机制保证在任何情况下必须先执行finally块然后再离开try块,因此在try块中发生异常的时候,Java虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息那么丧失了。Connectioncon = null;try con=dataSource.getConnection();/抛出数据库异常catch(SQLException e ) /捕获异常进行一些处理后再将数据库异常抛出给调用者处理throw e;finally try con.close();catch(SQLException e) e.printStackTrace();由于con为null,finally块有异常发生,从而使try块中发生的异常堆栈信息丧失。其调用者会得到如下信息:myPackage.MyClass.method1(methodl.Java:266)(四)异常不能影响对象的状态异常产生后不能影响对象的状态,这是异常处理中的一条重要规那么。一个函数中发生异常后,对象的状态应该和调用这个函数之前保持一致,以确保对象处于正确的状态中。如果对象是不可变对象(指调用构造函数创立后就不能改变的对象),即创立后没有任何方法可以改变对象的状态,那么异常发生后对象状态肯定不会改变。如果是可变对象,必须在编程中注意保证异常不会影响对象状态。有三个方法可以做到异常不能影响对象地状态:1将可能产生异常的代码和改变对象状态的代码分开,先执行可能产生异常的代码,如果产生异常,就不执行改变对象状态的代码。2对不容易别离产生异常代码和改变对象状态代码的方法,定义一个recover方法,在异常产生后调用recover方法修复被改变的类变量,恢复方法调用前的类状态。3在方法中使用对象的拷贝,这样当异常发生后,被影响的只是拷贝,对象本身不会受到影响。(五)注意丧失或忽略的异常 在程序设计中,可以丧失忽略一些异常,但是为了以后更好地维护代码,最好不要丧失异常。比方下面的代码:public void method2( ) trymethod1( ); /method1进行了数据库操作catch( SQLException e )/捕获数据库异常后将该异常封装为/MyException后重新抛出throw new MyException(“发生了数据库异常: +e.getMessage);public void method3( ) trymethod2( ); /调用method2(),抛出MyExceptioncatch (MyException e)e.printStackTrace( );在method2的代码中,try块捕获method1抛出的数据库异常SQLException后,抛出了新的自定义异常MyException。这段代码是似乎没有什么问题,但在控制台的输出却是:MyException:发生了数据库异常:对象名称“MyTable无效atMyClass.method2(MyClass.Java:232)atMyClass.method3(MyClass.Java:255)原始异常SQLException的信息丧失了,这里只能看到method2里面定义的MyException的堆栈情况,而method1中发生的数据库异常的堆栈那么看不到。如何排错呢?只有在method1的代码行中一行行去寻找数据库操作语句。JDK的开发者们也意识到了这个情况,在中,Throwable类增加了两个构造方法,public Throwable ( Throwablecause)和public Throwable ( Stringmessage, Throwablecause ),在构造函数中传入的原始异常堆栈信息将会在printStackTrace方法中打印出来。但在中就只能靠程序员来实现打印原始异常堆栈信息了。实现过程也很简单,只需要在自定义的异常类中增加一个原始异常字段,在构造函数中传入原始异常,然后重载printStackTrace方法,首先调用类中保存的原始异常的printStackTrace方法,然后再调用方法就可以打印出原始异常信息了。可以这样定义前面代码中出现的MyException类:public class MyException extends Exceptionpublic SMException ( Throwable cause )/构造函数this.cause1=cause;public MyException ( Strings ,Throwable cause )super(s);this.cause1=cause;/重载printStackTrace方法,打印出原始异常堆栈信息public void printStackTrace()if(cause1!=null)cause1.printStackTrace();super.printStackTrace(s);public void printStackTrace(PrintStream s)if(cause1!=null)cause1.printStackTrace(s); super.printStackTrace(s);public void printStackTrace( PrintWriter s )if(cause1!=null)cause1.printStackTrace(s);super.printStackTrace(s);private Throwable cause1;(六)不要同时使用异常机制和返回值来处理异常我们可能会使用类似下面一段代码:trydoSomething( );catch(MyException e)if(e.getErrcode=-1) if(e.getErrcode=-2) 假设过一段时间再来阅读这段代码,你很难弄明白程序的意思。混合使用Java异常处理机制和返回值使程序的异常处理局部变得混乱,并难以理解。在程序中,如果有多种不同的异常情况,就应该定义多种不同的异常,而不要像上面代码那样。综合使用Exception和返回值。处理应该如下:try doSomething( );/doSomething()抛出MyExceptionA和MyExceptionBcatch(MyExceptionA e) /捕获异常分别进行处理 catch(MyExceptionB e) (七)不要让try块过于庞大有人习惯用一个庞大的try块包含所有可能产生异常的代码,这样有两个害处:一是阅读代码的时候,在try块冗长的代码中,不容易知道到底是哪些代码会抛出哪些异常,不利于代码维护;二是使用try捕获异常是以程序执行效率为代价的,将不需要捕获异常的代码包含在try块中,影响了代码执行的效率。因此,在Java程序中最好将try块编写得简洁些。六 结束语Java是一种面向对象的程序设计语言,Java的异常处理机制非常出色。Java中的所有异常都是从根底类Throwable里继承而来的,所以可确保我们得到的是一个通用接口。丢弃一个错误的异常后,Java异常标准是在编译期间检查并执行的。被取代的方法必须遵守那一方法的根底类的异常标准。Java可丢弃指定的异常或者从指定异常衍生出来的其他异常。这样一来,运用try/catch/finally异常处理机制,最终得到的是更为“健壮的异常控制代码。Java异常处理为大的程序工程带来很好的健壮性。当然,在写本论文时,由于对Java的学习没到达深入、精通程度,掌握Java异常处理技术也不是很全面,故而论文中对Java图形程序的异常处理方面和Java异常处理机制具体实现的讨论仍有缺乏之处有待以后改良。致谢参考文献1Bloch . Java Programming Language Guide.北京:机械工业出版社,2001.2Cay S.Horstmann .Core Java 2(第6版) .北京:机械工业出版社,2004.3Rogers Cadenhead ,Laura Lemay.Teach Yourself Java 2 In 21days.北京:人民邮电出版社,2004.4朱福喜,唐晓军.Java程序设计技巧与实例.北京:人民邮电出版社,2004.5谭浩强,程龙,杨海兰,吴功宜.Java编程技术.北京:人民邮电出版社,2003.6彭晨阳.Java实用系统开发指南. 北京:机械工业出版社,2003.7Java 2 SDK Standard Edition Documentation9Java 2 程序设计.北京:清华大学出版社,2004.10Kalthy Sierra,Bert Bates.Java 2学习指南.北京:人民邮电出版社,2004.11耿祥义.Java根底教程.北京:清华大学出版社,2004.12朱福喜.Java程序设计技巧与开发实例.北京:人民邮电出版社,2004.13谢小乐.J2EE经典实例详解.北京:人民邮电出版社,2003.14Y.Daniel Liang.Java语言程序设计(第三版).北京:机械工业出版社,2005.15Bruce Eckel.Java编程思想. 北京:机械工业出版社,2005.附录、源代码 的源代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class SwingColorTest extends JFrame SwingColorControls RGBcontrols, HSBcontrols; JPanel swatch; public SwingColorTest() super(颜色调和板); setSize(400, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pane = new JPanel(); GridLayout grid = new GridLayout(1, 3, 5, 15); pane.setLayout(grid); /使用网格布局 swatch = new JPanel(); swatch.setBackground(Color.black); String rgbLabels = 红色, 绿色, 蓝色 ; RGBcontrols = new SwingColorControls(this, rgbLabels); String hsbLabels = 色调, 饱和度, 亮度 ; HSBcontrols = new SwingColorControls(this, hsbLabels); pane.add(swatch); pane.add(RGBcontrols); pane.add(HSBcontrols); setContentPane(pane); pack(); setVisible(true); /main函数 public static void main(String arguments) JFrame frame = new SwingColorTest(); /RGB和HSB的相互转换 void update(SwingColorControls control) Color c; / 从输入文本框中获得数据 int value = new int3; for (int i = 0; i 3; i+) valuei = Integer.parseInt(control.settingi.getText(); if ( (valuei 255) ) valuei = 0; control.settingi.setText( + valuei); if (control = RGBcontrols) c = new Color(value0, value1, value2); /转化为HSB float hsbValues = new float3; float HSB = Color.RGBtoHSB(value0, value1, value2,hsbValues); HSB0 *= 360; HSB1 *= 100; HSB2 *= 100; for (int i = 0; i 3; i+) HSBcontrols.settingi.setText(String.valueOf( (int)HSBi) ); else c = Color.getHSBColor( (float)value0 / 360, (float)value1 / 100, (float)value2 / 100 ); RGBcontrols.setting0.setText( String.valueOf(c.getRed() ); RGBcontrols.setting1.setText( String.valueOf(c.getGreen() ); RGBcontrols.setting2.setText( String.valueOf(c.getBlue() ); /更新图像颜色 swatch.setBackground(c); swatch.repaint(); class SwingColorControls extends JPanel implements ActionListener, FocusListener SwingColorTest frame; JTextField setting = new JTextField3; SwingColorControls(SwingColorTest parent, String label) frame = parent; GridLayout cGrid = new GridLayout(3, 2, 10, 10); setLayout(cGrid); for (int i = 0; i 3; i+) settingi = new JTextField(0); settingi.addFocusListener(this); settingi.addActionListener(this); JLabel settingLabel = new JLabel(labeli, JLabel.RIGHT); add(settingLabel); add(settingi); setVisible(true); public void actionPerformed(ActionEvent evt) if (evt.getSource() instanceof JTextField) frame.update(this); public void focusLost(FocusEvent evt) frame.update(this); public void focusGained(FocusEvent evt) The Technique and Application to the Java Exception HandlingAbstract:this paper briefly introduces the concepts,administrative levels of exception and the mechanism of applying the structure try-catch-finally to handle the exception.and it also explains the methods and steps to make a self-definition of exception of exception with example.It also and analyzes technique of Java Exception Handling mechanisms.Specifically speaking, this paper discuss Java exception from five sides :throw exceptionnot,seiz
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!