文档章节

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

狂奔啦蜗牛
 狂奔啦蜗牛
发布于 2012/08/26 10:11
字数 1314
阅读 66
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

原文所在地址:http://fishermen.iteye.com/blog/24031

理解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))。 


Java代码    收藏代码
  1. public void myFirstMethod() throws Exception  
  2.   
  3.     //Since it's an exception, I have to declare   
  4.   
  5.     //it in the throws clause {  
  6.   
  7.     throw new Exception();  
  8.   
  9. }  
  10.   
  11.    
  12.   
  13. public void mySecondMethod()  
  14.   
  15.     //Because errors aren't supposed to occur, you   
  16.   
  17.     //don't have to declare them.   
  18.   
  19. {  
  20.   
  21.     throw new Error();  
  22.   
  23. }  



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



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



Java代码    收藏代码
  1. public class ApplicationLoader extends ThreadGroup  
  2.   
  3. {  
  4.   
  5.      private ApplicationLoader()  
  6.   
  7.      {  
  8.   
  9.           super("ApplicationLoader");  
  10.   
  11.      }  
  12.   
  13.    
  14.   
  15.      public static void main(String[] args)  
  16.   
  17.      {  
  18.   
  19.           Runnable appStarter = new Runnable()  
  20.   
  21.           {  
  22.   
  23.                public void run()  
  24.   
  25.                {  
  26.   
  27.                     //invoke your application  
  28.   
  29.                     (i.e. MySystem.main(args)  
  30.   
  31. }  
  32.   
  33.           }  
  34.   
  35.           new Thread(new ApplicationLoader(), appStarter).start();  
  36.   
  37.      }  
  38.   
  39.    
  40.   
  41.      //We overload this method from our parent  
  42.   
  43.      //ThreadGroup , which will make sure that it  
  44.   
  45.      //gets called when it needs to be.  This is   
  46.   
  47.      //where the magic occurs.  
  48.   
  49. public void uncaughtException(Thread thread, Throwable exception)  
  50.   
  51.      {  
  52.   
  53.           //Handle the error/exception.  
  54.   
  55.           //Typical operations might be displaying a  
  56.   
  57.           //useful dialog, writing to an event log, etc.  
  58.   
  59.      }  


这个技巧太棒了。想想这种情况,你对你的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.如何可能的话,应该在系统级被捕捉

© 著作权归作者所有

狂奔啦蜗牛
粉丝 8
博文 17
码字总数 15025
作品 0
西安
程序员
私信 提问
02《Java核心技术》之Exception和Error有什么区别?

一、提出问题 世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确处理好意外情况,才能保证程序的可靠性...

飞鱼说编程
2018/09/10
46
0
BAT等公司必问的8道Java经典面试题,你都会了吗?

工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1、“知其然不知其所以然”。做了多年技术,开发了很...

java填坑路
01/06
0
0
如何处理异常? catch Exception OR catch Throwable

在Java中,当你需要统一处理异常的时候,你是会选择catch (Exception),还是直接catch (Throwable)? Java的异常体系 Throwable: Java中所有异常和错误类的父类。只有这个类的实例(或者子类...

狐狸糊涂
2014/12/23
3.1K
0
如何处理 PHP 的错误与异常(笔记)

这话题已经没有什么新意了,这里只是做做笔记,作为思路的一种整理,也以便后续忘了可以回来这里查找。 错误 以下是 PHP 最常见的几种错误: 运行上面代码,页面输出以下信息: 在生产环境下...

aisuhua
09/29
0
0
跳槽时,这些Java面试题99%会被问到

我在 Oracle 已经工作了近 7 年,面试过从初级到非常资深的Java工程师,且由于 Java 组工作任务的特点,我非常注重面试者的计算机科学基础和编程语言的理解深度,可以不要求面试者非要精通 ...

Java小铺
2018/08/15
479
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效

今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源、免版权费的视频编码格式,可以解决H.265昂贵的专利费用和复杂的...

一肥仔
24分钟前
8
0
软件缺陷静态分析 CodeSonar 5.2 新版发布

对于使用C和C++构建安全关键软件的开发团队而言,CodeSonar一直是首选的静态分析解决方案。在近期发行的版本中,CodeSonar通过使用开放标准来扩展其语言覆盖范围,并增加了对Java、C#、Obj...

旋极科技
25分钟前
5
0
数据迁移

1. insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,但要注意insert into select的加锁问题。 2. replace into与insert into on duplicate key update都可...

qiang123
31分钟前
6
0
Linux装Windows系统后还不会激活?3招教你搞定

     相信大家已经发现荣耀MagicBook科技尝鲜版有多“香”了,不但可以轻松的将Linux系统装回Windows系统,还足足省下了300大洋!但是装回系统就万事大吉了吗?NoNoNo,我们还需要去激活...

梅丽莎好
34分钟前
6
0
Tomcat8源码分析-请求处理过程

上一篇:Tomcat8源码分析-启动流程-start方法 此篇主要讲Tomcat8从接收请求到处理请求的时序图画出来,并用文字描述一下主要流程 时序图 说明 文字描述流程之前先提示如下两点: 1.Acceptor...

特拉仔
36分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部