`
vipshichg
  • 浏览: 267474 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java编程中异常处理的优劣

    博客分类:
  • java
阅读更多

Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理。不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念。我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:

好,不好和恶劣三种。

同时提供了一些解决这些问题的技巧。

首先解释一些java异常处理中必须搞清楚的定义和机制。Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作“不可检查”(Unchecked)异常;其他所有异常则称作“可检查”(Checked)异常。

所谓可检查异常,是指我们应该自行处理的异常。至于处理的手段,要么加以控制(try catch),要么通告(throws)他们有可能产生。通常,应捕捉那些已知如何处理的异常,而通告那些不知如何处理的异常。

而对那些不可检查异常来说,他们要么在我们的控制之外(Error),要么是我们首先就不该允许的情况(RuntimeException)。

至于异常的指定,Java的规则非常简单:一个方法必须通告自己可能产生的所有可检查异常。编写自己的方法时,并不一定要通告出方法实际可能产生的每一个异常对象,要想理解什么时候必须要方法的throws丛句来通告异常,就必须知道对一个异常来说,他只有可能在下面四种情况下才会产生:

1.调用了可能产生异常的方法。比如BufferedReader类的readLine方法。该方法通告java.io.IOException异常

2。发现到一个错误,并用throw语句产生异常。

3.出现一个编程错误。比如a[-1] = 0。

4.Java产生内部错误。

如果出现头两种情况之一,必须告诉打算使用自己方法的人:假如使用这个方法,可能造成一个异常的产生(即在方法头上使用throws),一个简单的记忆方法:

只要含有throw,就要通告throws。如果一个方法必须同时处理多个异常,就必须在头内指出所有异常。

就像下例展示的那样,用逗号对他们进行分割:

  1. class Animation  
  2.  
  3.     {  
  4.  
  5.     public Image loadImage(Strint s)  throws EOFException,MalformedURLException  
  6.  
  7.     {  
  8.  
  9.     ……  
  10.  
  11.     }  
  12.  
  13.     } 

然而,我们不需要通告内部java错误,也不应该通告自RuntimeException衍生出来的异常。

好的异常处理

好异常处理提供了处理程序错误的统一机制。事实上,Java语言通过向调用者提出异常警告的方式而显着地提升了软件开发中的异常处理能力。这种方式把Java语言中的“方法(method)”进行了扩展和增强,使之包括了自身的错误条件。下面就让我们看一个例子,这个例子说明了这种情况。

以下是FileInputStream构造器之一的原型:

public FileInputStream(String name) throws FileNotFoundException Java

的方法和构造器必须声明他们在被调用时可能“扔出”的异常,采用的关键字就是“throws”。这种在方法原型中出现的异常提示增加了编程的可靠性。

显而易见,这种方式是向方法的调用者提示了可能出现的异常条件,这样调用者就可以对这些异常作出适当的相应处理。以下代码示意我们是如何捕获并且处理FileNotFoundException 这一异常的:

  1. try 
  2.  
  3.     {  
  4.  
  5.     FileInputStream fis = new FileInputStream(args[0]);  
  6.  
  7.     // other code here …  
  8.  
  9.     }  
  10.  
  11.     catch (FileNotFoundException fnfe)  
  12.  
  13.     {  
  14.  
  15.     System.out.println("File: " + args[0] + " not found. Aborting.");  
  16.  
  17.     System.exit(1);  
  18.  
  19.     } 

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进行子类化以回避检查异常的限制,从而便于产生这些异常的方法为其调用者所使用。

专业的开发团队应当只允许在很少的情况下才可以这样做。

第二种异常处理的陋习是catchall构造器。所谓的“catchall 构造器”就是一种异常捕获代码模块,它可以处理所有扔给它的可能异常。

以下是catchall处理器的实例:

  1. try 
  2.  
  3.     {  
  4.  
  5.     // code here with checked exceptions  
  6.  
  7.     }  
  8.  
  9.     catch (Throwable t)  
  10.  
  11.     {  
  12.  
  13.     t.printStackTrace();  
  14.  
  15.     } 

我得承认,我自己在编写一般程序的时候就曾经用过这种技术;但是,在编写关键程序的时候这种类型的构造器一定要避免使用,除非他们被授权可以和中央错误处理器联合使用才可以这样做。

除此之外,catchall构造器不过只是一种通过避免错误处理而加快编程进度的机制。

异常处理的一个不足之处是难以采用优良的错误处理策略。从低容内存状态恢复、写入错误和算法错误等异常情况都不是轻易能得到解决的。你可以尝试一下循环、垃圾收集和提醒用户等常用技术来应付以上的局面。

恶劣的处理方法

和许多Java特性及其API类似,Java的异常处理机制也有“霸王硬上弓”类的滑稽错误。比方说,为了扔出某个异常竟然毫不犹豫地用“new”关键词为其分配内存就是这样的例子。

我自己不知道有多少次就因为犯了这种错误而在严肃的编译器面前屡屡碰壁。在这种情况下,我们其实都是在伺候语言而不是让语言为我们所用。还有我们碰到的OutOfMemoryErrors就是异常处理的缺陷。这一处理过程是:

使用finally模块关闭文件,解析异常以得到出现问题的方法和代码行。在这一过程之内最大的缺陷是需要捕获OutOfMemoryError,而这一异常却并不是可检查异常!想想看,内存耗尽是相当常见的情况。任何与内存使用状态紧密相关的程序都应当捕获和处理这一错误。

使用异常时的一些建议

1.异常控制的设计宗旨并不是用来代替一些简单的测试。只有在异常情况下才使用异常!

2.不要过分细化异常。不要在每个语句上都加上异常处理,最好将整个任务都放在try块内。如果其中有一项操作失败,可以随即放弃任务。

3.不要“压制”异常。对于需要通告异常的方法,我们可以改用捕捉的方法来将异常强行关闭,如果真的出现异常,那个异常会被“静悄悄”的忽略。如果觉得产生的异常会非常重要,就必须多费些功夫,对其进行正确的控制。

4.不要介意异常的传递。如果调用的方法会产生异常,比如readLine方法,他们天生就能捕捉自己可能产生的异常,在这种情况下,一种更好地做法是将这些异常传递出去,而不是自己动手来捕捉它。

4
18
分享到:
评论

相关推荐

    java编程中异常处理的优劣观

    在Java编程中,异常处理是不可或缺的一部分,它确保了程序的健壮性和稳定性。异常处理是一种机制,允许程序员在程序运行时捕获并处理错误,而不是让程序无控制地崩溃。这一机制通过try-catch-finally语句块来实现,...

    Java编程中异常处理的优劣之道

    Java编程中的异常处理是编程实践中不可或缺的一部分,它关乎程序的健壮性和稳定性。本文主要讨论了Java异常处理的三个层次:好、不好和恶劣的处理方式,并提供了相关的处理技巧。 首先,我们需要理解Java异常的基本...

    Java编程中特别处理的优劣之道_.docx

    ### Java编程中特别处理的优劣之道 #### 一、特别处理的概念与分类 Java编程中的特别处理(异常处理)是确保程序健壮性和稳定性的关键机制。Java将异常分为两类:“不可检查”(Unchecked)异常和“可检查”...

    深入理解Java编程中异常处理的优劣

    Java编程中的异常处理是保证程序健壮性与稳定性的关键环节。本文主要探讨了Java异常处理的优缺点,包括对不同类型的异常分类、处理策略以及最佳实践。 首先,Java异常分为两大类:不可检查异常(Unchecked)和可...

    异常处理的优劣观,异常处理

    ### 异常处理的优劣观 在编程领域中,异常处理是确保程序稳定性和健壮性的关键机制之一。本文将深入探讨Java中的异常处理机制,并分析其优势与不足之处,帮助开发者更好地理解和运用这一机制。 #### Java异常处理...

    JAVA遗传算法编程pdf版本书籍

    为了使读者能够顺利地用Java实现遗传算法,书中会回顾Java编程的基础知识,包括数据类型、控制结构、类与对象、接口、异常处理、多线程等,确保读者具备必要的编程技能。 三、遗传算法的Java实现 书中将详细阐述...

    探讨计算机软件开发的Java编程语言应用.pdf

    Java编程语言之所以能够成为众多编程语言中的佼佼者,与其自身的特点是分不开的。编程初学者可以轻松地学习和掌握Java语言,而有经验的程序员也可以利用Java语言的特点快速进行软件开发。Java的普及也得益于其丰富的...

    超牛的Java五子棋

    Java五子棋是一款基于Java编程语言开发的棋类游戏,主要体现了Java的图形用户界面(GUI)设计、事件处理和算法应用等核心知识点。在这个游戏中,玩家可以通过点击棋盘来放置棋子,当一方的棋子在横、竖、斜线上达到...

    用java编写的中国象棋

    在中国象棋这个项目中,开发者使用Java编程语言构建了一个完整的象棋游戏系统。Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而著名,这使得Java成为开发跨平台应用的理想选择,如中国...

    java入门,面试圣经

    首先,Java的基础语法涵盖了变量声明、数据类型、运算符、控制流语句(如if-else、for、while、do-while循环和switch-case)、方法、数组以及异常处理等。掌握这些语法是编程的基石,它帮助开发者理解和编写有效的...

    横向技术分析C#、C++和Java优劣.doc

    在异常处理方面,C#比Java表现得更好,无论是内置支持还是执行效率。在跨平台能力上,Java以其JVM的广泛实现赢得了赞誉,尽管性能有时会成为问题。相比之下,C#虽然在底层设计上考虑了移植性,但目前成熟的跨平台...

    Java程序设计课程实践教学探讨.pdf

    Java类库是Java编程中不可或缺的一部分,它包含大量的类、接口和方法,用于执行各种操作。在教学中,教师需要引导学生熟悉常用的Java类库,包括Java基础类库、异常处理、图形用户界面(GUI)以及输入输出(I/O)流等...

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    5. **异常处理**:异常处理是Java编程中的一个重要方面,Bloch建议避免使用空检查,而应优先考虑抛出异常,他还讨论了如何编写自定义异常类以及何时应该使用checked异常和unchecked异常。 6. **多线程编程**:在...

    Java实训 Java高级应用编程 第2章 集合(共33页).ppt

    Java中的集合类是Java编程中不可或缺的一部分,它们用于存储和管理对象。集合框架是一个统一的接口层次结构,提供了丰富的操作和算法,使得处理对象集合变得简单高效。在Java中,集合类位于`java.util`包内,它们为...

    java葵花宝典

    异常处理也是Java编程的重要一环。运行时异常与一般异常(也称检查型异常)在处理上有所区别。运行时异常是程序运行时可能出现的错误,如空指针异常,编译器不强制捕获,而一般异常在方法签名中需要声明抛出,否则...

    主流编程语言优劣比较.docx

    【编程语言优劣比较】 在IT领域,编程语言的选择至关重要,因为不同的语言有着各自的特性和适用场景。本文将深入探讨几种主流的编程语言——C、C++、Java、.NET、Ruby以及JavaScript,分析它们的优缺点。 1. **...

    java五子棋人机人人

    在这个项目中,我们将探讨Java编程基础、图形用户界面(GUI)设计、算法实现以及人工智能在游戏中的应用等关键知识点。 1. **Java编程基础**: - **类与对象**:五子棋游戏的核心是棋盘和棋子,这可以通过创建棋盘...

    java 五子棋游戏.zip

    - **异常处理**:在游戏运行过程中可能出现各种异常情况,如非法操作、文件读写错误等,Java的异常处理机制能确保程序的健壮性。 - **多线程**:为了实现人机对战或双人对战,Java的多线程技术被用于控制游戏的...

    山东大学java课程设计黑白棋

    通过这个项目,学生不仅可以掌握Java编程基础,还能深入理解面向对象的设计思想,提高问题解决能力和团队协作技巧。同时,游戏开发过程中涉及到的算法设计和实现,也是计算机科学中的重要组成部分,对培养学生的逻辑...

Global site tag (gtag.js) - Google Analytics