|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
Java编程中的非常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到非常处理。不过,我认为很多人其实并没有真正把握准确处理非常情况的方式和策略,最多也就不过了解个大概,知道点概念。本文就对三种不同程度和质量的Java非常处理进行了讨论,所阐述的处理非常的方法按手法的高下分为:好,不好和恶劣三种。同时向你提供了一些解决这些问题的技巧。 好 非常处理提供了处理程序错误的统一机制。事实上,Java语言通过向调用者提出非常警告的方法而显著地提升了软件开发中的非常处理能力。这种方法把Java语言中的“方式(method)”进行了扩展和增强,使之包括了自身的错误条件。下面就让我们看一个例子,这个例子说明了这种情况。 以下是FileInputStream构造器之一的原型: public FileInputStream(String name) throws FileNotFoundException 这个原型和C或者C++语言中的同类原形都不相同,Java的方式和构造器必须声明他们在被调用时可能“扔出”的非常,采用的要害字就是“throws”。这种在方式原型中出现的非常提示增加了编程的可靠性。显而易见,这种方法是向方式的调用者提示意了可能出现的非常条件,这样调用者就可以对这些非常作出适当的相应处理。 以下代码示意我们是如何捕捉并且处理FileNotFoundException 这一非常的: try { FileInputStream fis = new FileInputStream(args[0]); // other code here ... } catch (FileNotFoundException fnfe) { System.out.println("File: " + args[0] + " not found. Aborting."); System.exit(1); } Java非常处理还有其他一些优秀的特性,这就是可检查非常、用户定义非常和在JDK 1.4中推出的新型Java记录API(Java Logging API)。 java.lang.Exception的所有子类都属于可检查非常。可检查非常(checked exception)是扔出该非常的方式所必须提示的非常,这种非常必须被捕捉或者向调用者提示。 用户定义非常(User-defined exceptions)是定制的非常类,这种非常类扩展了java.lang.Exception类。优良的Java程序规定定制非常封装、报告和处理他们自己独有的情况。最新的Java记录API(logging API)则可以集中记录非常。 不好 Java非常处理不好的一面包括两种情况:滥用非检查非常(unchecked exceptions)和滥用catchall构造器等。这两种方法都使得问题变得复杂起来。 有一种类别的非常属于RuntimeException的子类,这种非常不会受到编译器的检查。比如,NullPointerException和 ArrayStoreException就是这种类型非常的实例。程序员可以对RuntimeException进行子类化以回避检查非常的限制,从而便于产生这些非常的方式为其调用者所使用。专业的开发团队应当只答应在很少的情况下才可以这样做。第2种非常处理的陋习是catchall构造器。所谓的“catchall 构造器”就是一种非常捕捉代码模块,它可以处理所有扔给它的可能非常。 以下是catchall处理器的实例: try { // code here with checked exceptions } catch (Throwable t) { t.printStackTrace(); } 我得承认,我自己在编写一般程序的时候就曾经用过这种技术;但是,在编写要害程序的时候这种类型的构造器一定要避免使用,除非他们被授权可以和中心错误处理器联合使用才可以这样做。除此之外,catchall构造器不过只是一种通过避免错误处理而加快编程进度的机制。 非常处理的一个不足之处是难以采用优良的错误处理策略。从低容内存状态恢复、写入错误和算法错误等非常情况都不是容易能得到解决的。你可以尝试一下循环、垃圾收集和提醒用户等常用技术来应付以上的局面。 恶劣 和许多Java特性及其API类似,Java的非常处理机制也有“霸王硬上弓”类的滑稽错误。比方说,为了扔出某个非常竟然毫不犹豫地用“new”要害词为其分配内存就是这样的例子。我自己不知道有多少次就因为犯了这种错误而在严厉的编译器面前屡屡碰壁。在这种情况下,我们其实都是在伺候语言而不是让语言为我们所用。 在我编写的Java Pitfalls一书中探讨了几个非常处理方面的缺陷,比如处理OutOfMemoryErrors就是其一。这一处理过程是:使用finally模块关闭文件,解析非常以得到出现问题的方式和代码行。在这一过程之内最大的缺陷是需要捕捉OutOfMemoryError,而这一非常却并不是可检查非常!想想看,内存耗尽是相称常见的情况。任何与内存使用状态紧密相关的程序都应当捕捉和处理这一错误。 最后,让我们考虑两个尚不属于Java非常处理机制的特性。第一,目前的情况是,在你成功地处理了非常之后你没有办法回到你刚才离开的地方。而C语言下的setjmp() 和longjmp()函数则可以实现这一特性,Java理应有这两个函数的对应版本,而我们也应该可以用“resume”要害词实现它。 第二个没有实现的特性是全局非常处理器,对比物就是C++语言中的set_new_handler()。比方说,在编程的时候,即便OutOfMemoryError非常比java.lang.Error 的子类更常见,但我们也可以针对OutOfMemoryError非常而采用全局处理器,这样的效果会比对其采用通常的可检查非常要好得多。假如你觉得对这些特性异常在意,那么你可以在Java Developer Connection那里提出自己的建议:在Java平台内增加这些特性吧! 返回类别: 教程 上一教程: 一些无聊的代码之一:JAVA中的日期计算 下一教程: Oracle & JSP 开发的小型信息治理系统 (四) 源代码3 您可以阅读与"非常处理优劣观(转载)"相关的教程: · 上传图片的缩放处理 - 异常实用!(感谢loveyourvv兄弟) · Java非常处理--尽量不要从try区段中返回(return) · 突破Java非常处理规则 · 关于java非常处理机制的深入理解 · Java非常处理的陋习展播 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |