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

error 和 exception 之间的区别

    博客分类:
  • Java
阅读更多

很多程序员不清楚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.如何可能的话,应该在系统级被捕捉

 

转自:http://fishermen.iteye.com/blog/24031

分享到:
评论

相关推荐

    error与Exception的区别

    3. **继承结构**:`Error`和`Exception`都继承自`Throwable`类,但它们之间并不直接互相继承。`Exception`是为应用程序异常设计的,而`Error`是为系统异常保留的。 4. **编程实践中**:程序员应尽量避免抛出`Error`...

    Java中Error与Exception的区别.doc

    Java中Error与Exception的区别 Java 中的 Error 和 Exception 是两个不同的...Error 和 Exception 是 Java 中两个不同的概念,它们之间存在着许多不同之处,了解它们的区别对于我们编写高质量的 Java 程序非常重要。

    Error类和Exception类剖析

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

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

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

    运行时异常与一般异常的区别?

    Error 和 Exception 都是 java.lang.Throwable 的子类。Error 表示由 JVM 所侦测到的无法预期的错误,这些错误是 JVM 层次的严重错误,导致 JVM 无法继续执行,因此,这是不可捕捉的,无法采取任何恢复的操作,一般...

    Windows Exception Handling

    这种处理方式允许在不同的代码块之间传递控制流,从而实现更精细的错误管理和资源清理。 #### 向量异常处理 向量异常处理提供了一种注册多个异常处理器的能力,允许开发者针对特定类型的异常指定多个处理函数。...

    如何解决weblogic multicast Exception

    - 对于`JAVA_OPTIONS`中的其他参数,如`-Xms256m`、`-Xmx512m`和`-XX:MaxPermSize=256m`,这些是关于Java虚拟机内存的设置。虽然它们与Multicast问题关系不大,但确保这些参数正确无误也是必要的。 - `...

    java异常exception

    例如,在调用`Graphics.setColor(int red, int green, int blue)`方法时,如果传入的红色、绿色或蓝色值超出了有效范围(通常为0到255之间),则可能会引发此类异常。为了确保参数的有效性,开发者可以在接收参数时...

    exception.7z

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

    Uncaught exception com_exception with message Failed to create COM object

    本文将详细解析"Uncaught exception com_exception with message Failed to create COM object"这一错误的原因以及如何解决。 当尝试在PHP中创建一个COM对象,如`InternetExplorer.Application`,用于模拟用户交互...

    java 异常 问题收集 Exception

    Java异常处理是编程过程中至关重要的一个环节,它帮助开发者捕获和处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。在这个“java 异常 问题收集 Exception”主题中,我们将深入探讨Java异常处理的基本概念...

    springcloud应用之feign

    在Spring Cloud生态系统中,Feign是一个重要的组件,它充当了微服务之间通信的客户端代理,实现了声明式的Web服务调用。Feign使开发者能够轻松地创建面向接口的客户端,简化了服务之间的远程调用。本篇文章将深入...

    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关键字的使用、堆与栈的区别、超大整数的存储与运算,以及图形系统的基本元素设计。...

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

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

    各层之间的自定义错误层层递出源码

    class CustomError(Exception): def __init__(self, message): super().__init__(message) self.error_type = 'Custom' ``` 2. **捕获和抛出错误**:在代码中,我们需要根据业务逻辑来决定何时捕获并抛出...

Global site tag (gtag.js) - Google Analytics