`
fishermen
  • 浏览: 377905 次
社区版块
存档分类
最新评论

理解error和exception之间的区别

阅读更多
理解error和exception之间的区别,学习如何对其进行处理



很多程序员不清楚error和exception之间的区别,这区别对于如何正确的处理问题而言非常重要(见附1,“简要的叙述error和exception”)。就像Mary Campione的“The Java Tutorial”中所写的:“exception就是在程序执行中所发生的中断了正常指令流的事件(An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.)。”依照美国传统辞典(American Heritage Dictionary)所解释的,error就是:“效果或情况背离了可接受的一般法则(The act or an instance of deviating from an accepted code of behavior.)”



背离(deviation)、中断(disruption),有什么区别呢?让我们来这样想:如果你驱车在公路上行驶时有人拦住了你,这就叫做“中断”。如果车根本就无法发动,那就叫做“背离”。

这与Java有什么关系呢?很多。Java中有一个相当有趣的error和exception的结构。

是的,非常正确:所有使用try{} catch(Exception e){}的代码块只能找到你一半的错误。但是,是否try并catch Throwable取决于你捕捉它的原因。快速的看一下Error的子类,它们的名字类似VirtualMachineError,ThreadDeath,LinkageError。当你想捕获这些家伙们的时候,你要确定你需要捕获它们。因为那些都是很严重的错误。

但是ClassCastException是一个error吗?不完全是。ClassCastException或任何类型的exception只是虚拟机(VM,VirtualMachine)让你知道有问题发生的方式,这说明,开发者产生了一个错误,现在有一个机会去修正它。

另一方面,error是虚拟机的问题(通常是这样,但也可能是操作系统的问题)。引用Java文档中关于error的说明:“Error是Throwable的子类,它的出现说明出现了严重的问题。一般应用程序除非有理由,否则不应该捕捉Error。通常这是非常反常的情况。”

所以,error非常强大,而且但处理它远比一般开发者想象的要难(当然不是你)。如果你在做一项很简单的工作的话,你认为有必要去处理error?

首先,记住,error跟exception抛出的方式大体相同的,只有一点不同。就是一个抛出error的方法不需要对此进行声明(换句话说,这是一个unchecked exception(也被称做Runtime Exception))。


public void myFirstMethod() throws Exception

    //Since it's an exception, I have to declare 

    //it in the throws clause {

    throw new Exception();

}

 

public void mySecondMethod()

    //Because errors aren't supposed to occur, you 

    //don't have to declare them. 

{

    throw new Error();

}



注意,有一些exception是不可控制的(unchecked exception),跟error的表现是一样的,如:NullPointerException,ClassCastException和IndexOutOfBoundsException,它们都是RuntimeException的子类。RuntimeException和其子类都是unchecked excception。



那应该如何处理这些令人讨厌的unchecked exception呢?你可以在可能出现问题的地方catch它们,但这只是一个不完整的解决方法。这样虽然解决了一个问题,但其余的代码仍可能被其他unchecked exception所中断。这里有一个更好的办法,感谢ThreadGroup类提供了这个很棒的方法:



public class ApplicationLoader extends ThreadGroup

{

     private ApplicationLoader()

     {

          super("ApplicationLoader");

     }

 

     public static void main(String[] args)

     {

          Runnable appStarter = new Runnable()

          {

               public void run()

               {

                    //invoke your application

                    (i.e. MySystem.main(args)

}

          }

          new Thread(new ApplicationLoader(), appStarter).start();

     }

 

     //We overload this method from our parent

     //ThreadGroup , which will make sure that it

     //gets called when it needs to be.  This is 

     //where the magic occurs.

public void uncaughtException(Thread thread, Throwable exception)

     {

          //Handle the error/exception.

          //Typical operations might be displaying a

          //useful dialog, writing to an event log, etc.

     }


这个技巧太棒了。想想这种情况,你对你的GUI程序进行了修改,然后一个unchecked exception被抛出了。并且你的GUI程序常常具有了错误的状态(对话框仍旧开着,按钮失效了,光标状态出现错误)。但是,使用这个技巧,你可以将你的GUI程序恢复原始状态并通知用户出现了错误。对自己感觉很棒吧,因为你写了一个高质量的应用程序。

这个技巧并不只适用于GUI程序。服务器端应用程序可以使用这个技巧来释放资源,防止虚拟机进入不稳定状态。较早的捕获错误并聪明的将其处理是好的程序员和普通程序员的区别之一。你已经明白了这些,我知道你想成为哪一类程序员。

[color=cyan]关于作者

Josh Street是Bank of America的构架设计师。他主要负责电子商务平台的开发。他的联系方式是rjstreet@computer.org。
[/color]



附1


简要的叙述error和exception



Error和Exception都继承自Throwable,他们下列不同处:



Exceptions

1.可以是 可被控制(checked) 或 不可控制的(unchecked)

2.表示一个由程序员导致的错误

3.应该在应用程序级被处理



Errors

1.总是 不可控制的(unchecked)

2.经常用来用于表示系统错误或低层资源的错误

3.如何可能的话,应该在系统级被捕捉
分享到:
评论

相关推荐

    error与Exception的区别

    理解它们之间的区别对于编写健壮和可靠的代码至关重要。 首先,我们来看"error"。在Java中,`Error`是`java.lang.Error`类的实例,通常表示系统级或编译时的严重问题。这些问题通常是程序员无法控制或恢复的,比如...

    Java中Error与Exception的区别.doc

    理解 `Error` 和 `Exception` 之间的区别对于编写高质量的Java程序至关重要。正确的识别和处理异常不仅可以提高程序的健壮性,还可以提升程序的用户体验。在开发过程中,应当尽量避免抛出 `Error` 类型的异常,并...

    Error类和Exception类剖析

    总的来说,理解Error和Exception的区别对于编写健壮的Java代码至关重要。正确地处理和区分这两类异常可以帮助我们及时识别和修复问题,提高程序的稳定性和可靠性。在编程实践中,应尽可能避免抛出Error,因为它们...

    第2讲 Exception和Error有什么区别1

    【Exception和Error的区别】 在Java编程中,Exception和Error都是基于`Throwable`类的子类,它们构成了Java异常处理机制的基础。理解两者的差异对于编写健壮的代码至关重要。 1. **Exception**: Exception是程序...

    Windows Exception Handling

    在深入探讨Windows异常处理机制之前,我们先简要回顾一下异常处理的基本概念。异常处理是计算机编程中的一...对于软件开发者而言,深入理解这些机制不仅有助于编写更加健壯的应用程序,还能提升故障排查和调试的效率。

    如何解决weblogic multicast Exception

    ### 如何解决WebLogic Multicast Exception 在处理WebLogic服务器时,可能会遇到与Multicast相关的异常,这通常会影响到集群的正常工作。以下内容将详细解释如何解决“WebLogic Multicast Exception”这一问题,并...

    exception.7z

    异常层次结构:所有的异常都继承自`java.lang.Throwable`类,`Exception`和`Error`是其两个主要子类。`Exception`用于应用程序可以预见的异常,而`Error`通常表示严重的问题,如JVM内部错误,应用程序通常无法恢复。...

    java 异常 问题收集 Exception

    通过对这些文档《java web 开发问题总结》的深入学习,我们可以更好地理解和解决实际开发中遇到的Java异常问题,提升代码质量,确保应用程序的稳定运行。无论是对于初学者还是经验丰富的开发者,掌握好Java异常处理...

    jsp错误处理页面的例子

    - Java的异常体系包括`java.lang.Throwable`作为所有异常的基类,它有两个主要子类:`Error`和`Exception`。`Error`通常表示系统级别的错误,而`Exception`用于应用程序可以预见并处理的异常。 6. **异常的分类**...

    oralce异常信息对照表

    在BEGIN和END之间,你可以编写可能会抛出异常的SQL或PL/SQL代码。在EXCEPTION部分,你可以捕获并处理特定类型的异常。例如: ```sql BEGIN SELECT column INTO variable FROM table WHERE condition; EXCEPTION ...

    java面试题J2SEJ2MEJ2EE

    Java面试题涵盖了许多核心概念,包括异常处理、接口与虚类的区别、垃圾回收机制、线程同步、Error与Exception的差异、final关键字的使用、堆与栈的区别、超大整数的存储与运算,以及图形系统的基本元素设计。...

    spring 事务管理的理解

    默认情况下,运行时的检查异常(checked exception)不会导致事务回滚,而未检查异常(unchecked exception)和Error会。可以通过设置@Transactional注解的rollbackFor属性自定义回滚规则。 综上所述,Spring的事务...

    具有FaultException详细信息的WCF DataContract

    总的来说,理解并有效地利用WCF Data Contract和FaultException可以帮助开发者创建健壮、容错的服务,同时提供清晰的错误信息,以便客户端进行调试和处理。通过学习和实践,我们可以利用这些技术构建高效、安全的...

    IT通信互联网2014校招笔试题汇总

    在异常处理上,需要了解Java异常的分类,包括Error和Exception,以及CheckedException和UncheckedException的区别和处理方式。字符串的处理也是常见的考题,例如分析特定代码段中创建了多少个对象。另外,对流...

    CentOS7运行.sh脚本提示syntax error: unexpected end of file的解决方法

    在Linux系统中,尤其是CentOS 7这样的发行版,运行.sh脚本时遇到"**syntax error: unexpected end of file**"或"**...如果你经常需要在Windows和Linux之间编辑脚本,了解并熟练掌握文件格式转换的技巧是非常重要的。

    软件工程课后习题宝典

    异常分为两类:Error和Exception。Error表示系统级的严重问题,如内存溢出或线程死锁,这些问题通常意味着程序无法恢复,程序可能会终止运行。而Exception则分为系统异常(编译器强制处理的checked异常)和普通异常...

    C# 捕获C/C++异常的例子

    总结来说,理解和处理C#与C++之间的异常转换是跨语言开发的关键技能。通过适当的设计和实现,我们可以确保C++的异常能够被C#有效地捕获和处理,从而增强程序的健壮性和稳定性。在实际项目中,确保正确处理各种异常...

    java面试题总结面试宝典

    异常处理是Java编程中不可忽视的部分,文档中列举了运行时异常和一般异常的区别、error和exception的区别,以及在Java中进行异常处理的关键字:try, catch, finally, throws和throw的含义和使用。特别地,Java线程的...

    hive on tez 常见报错问题收集

    在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,被广泛用于结构化数据的查询、分析和...同时,对于复杂的查询场景,理解Hive和Tez的工作原理以及它们之间的交互至关重要,这有助于更好地诊断和解决问题。

Global site tag (gtag.js) - Google Analytics