很多程序员不清楚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))。

Java代码  收藏代码

    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类提供了这个很棒的方法:

Java代码  收藏代码

    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之间的区别的更多相关文章

  1. Throwable、Error、Exception、RuntimeException 区别 联系

    1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获 ...

  2. 深入理解 sudo 与 su 之间的区别【转】

    深入理解 sudo 与 su 之间的区别 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升 ...

  3. 理解 CI 和 CD 之间的区别(翻译)

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...

  4. 深入理解 sudo 与 su 之间的区别

    深入理解 sudo 与 su 之间的区别 作者: Himanshu Arora 译者: LCTT zhb127 在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容.同时,在该文章的末尾有提到 ...

  5. 运行时异常与受检异常有何异同、error和exception有什么区别

    1.运行时异常与受检异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生.受检异常跟程序 ...

  6. Throwable、Error、Exception、RuntimeException 区别

    1.java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 2.Error是Throwable 的子类,用于指示合理的应用 ...

  7. java基础面试题:运行时异常与一般异常有何异同?error和exception有什么区别? 请写出你最常见到的5个runtimeexception?

    Throwable是Java错误处理的父类,有两个子类:Error和Exception. Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的 Exception:可恢复捕 ...

  8. error 和 exception 有什么区别?

    1.error指恢复不是不可能但非常困难的情况下的一种严重错误.比如内存溢出,不指望程序可以处理这样的情况. 2.exception表示一种设计或者实现问题,如果程序正常运行,则从不会发生.

  9. java中Error与Exception有什么区别

    Error类和Exception类都继承自Throwable类. Error的继承关系: java.lang.Object  java.lang.Throwable      java.lang.Er ...

随机推荐

  1. MySQL_执行计划详细说明

          1 简要说明 id 表格查询的顺序编号. 降序查看,id相同的从上到下查查看. id可以为null ,当table为( union ,m,n )类型的时候,id为null,这个时候,id的 ...

  2. hosts文件路径及文件介绍

    路径:WINDOWS/system32/drivers/etc/hosts 内容127.0.0.1       localhost 一. Hosts文件的位置 很多用户都知道在Window系统中有个H ...

  3. 201621123031 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需 ...

  4. mysql基础篇 - 数据库及表的修改和删除

    基础篇 - 数据库及表的修改和删除         修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...

  5. iOS开发-OC数据类型

    以下是OC中的实例,Swift部分不适用 iOS中的注释 // 单行注释 // 注释对代码起到解释说明的作用,注释是给程序员看的,不参与程序运行 /*  多行注释   Xcode快捷键   全选 cm ...

  6. 浅谈数据结构vector

    vector: 又名 向量 1.C++中的一种数据结构. 2.是一个类. 3.相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. A.使用时, ...

  7. Raid 5数据恢复原理以及raid 5数据恢复实际操作案例

    Raid 5数据恢复算法原理 要理解 raid 5数据恢复原理首先要先认识raid5,"分布式奇偶校验的独立磁盘结构"也就是我们称之为的raid 5数据恢复有一个概念需要理解,也就 ...

  8. Java并发编程实战 之 线程安全性

    1.什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全 ...

  9. EasyUI内容页Tabs。

    html: <div data-options="region:'center'"> <div id="tabs" class="e ...

  10. Eclipse常用快捷键总结

    Eclipse常用快捷键总结 CTRL+C(复制).CTRL+X(剪切).CTRL+Z(撤销).CTRL+F(查找).CTRL+H(搜索文件或字符串).CTRL+Y(重做).CTRL+/(双斜杠注释) ...