理解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代码 收藏代码
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之间的区别的更多相关文章
- Throwable、Error、Exception、RuntimeException 区别 联系
1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获 ...
- 深入理解 sudo 与 su 之间的区别【转】
深入理解 sudo 与 su 之间的区别 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升 ...
- 理解 CI 和 CD 之间的区别(翻译)
博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...
- 深入理解 sudo 与 su 之间的区别
深入理解 sudo 与 su 之间的区别 作者: Himanshu Arora 译者: LCTT zhb127 在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容.同时,在该文章的末尾有提到 ...
- 运行时异常与受检异常有何异同、error和exception有什么区别
1.运行时异常与受检异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生.受检异常跟程序 ...
- Throwable、Error、Exception、RuntimeException 区别
1.java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 2.Error是Throwable 的子类,用于指示合理的应用 ...
- java基础面试题:运行时异常与一般异常有何异同?error和exception有什么区别? 请写出你最常见到的5个runtimeexception?
Throwable是Java错误处理的父类,有两个子类:Error和Exception. Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的 Exception:可恢复捕 ...
- error 和 exception 有什么区别?
1.error指恢复不是不可能但非常困难的情况下的一种严重错误.比如内存溢出,不指望程序可以处理这样的情况. 2.exception表示一种设计或者实现问题,如果程序正常运行,则从不会发生.
- java中Error与Exception有什么区别
Error类和Exception类都继承自Throwable类. Error的继承关系: java.lang.Object java.lang.Throwable java.lang.Er ...
随机推荐
- [bzoj3173]最长上升子序列_非旋转Treap
最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...
- Jmeter 多用户同时登陆
在做性能测试的时候,很多情况需要多用户同时登录,下单,那怎么实现多用户的同时登录呢 可以通过CSV Data Set Config组件实现参数化登录 1.新建一个存放用户名和密码的文件, 和jmete ...
- Android类参考---SQLiteOpenHelper
public 抽象类 SQLiteOpenHelper 继承关系 java.lang.Object |____android.database.sqlite.SQLiteOpenHelper 类概要 ...
- Java注解(1)-注解基础
注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解 ...
- Java基础学习笔记六 Java基础语法之类和ArrayList
引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...
- 软工实践项目需求分析(团队)修改版get√-黄紫仪
日常前言:随笔距离文档大体完成已经过去了2天+(因为中间插了一波结对作业),所以目测感受没有那时候清晰(那时候烦的想打人了都--)需求分析那边去百度找了模板.emmmm好多东西感觉听都没听说过QAQ, ...
- Welcome to StackEdit!
Welcome to StackEdit! Hey!our first Markdown document in StackEdit1. Don't delete me, I'm very helpf ...
- C语言第二次作业---分支结构
一.PTA实验作业 题目1:计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if(x>=0){ y=sqrt(x); } ...
- 201621123054 《Java程序设计》第六周实验总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 1.2 可选:使用常规方法总结其他上课内容. 2 ...
- 个人技术博客(alpha)
APP的权限校验不同于web网页端,web一般使用session记录用户的状态信息,而app则使用token令牌来记录用户信息.有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在 ...