博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的Error和Exception
阅读量:5132 次
发布时间:2019-06-13

本文共 2212 字,大约阅读时间需要 7 分钟。

Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception和Error体现了Java平台设计者对不同异常情况的分类。

Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常 见的比如OutOfMemoryError之类,都是Error的子类。

Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。

不可查 的Error,是Throwable不是Exception。 不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕 获,并不会在编译期强制要求。

 

Error和Exception的联系

继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。

Error和RuntimeException及其子类称为未检查异常(Unchecked exception),其它异常成为受检查异常(Checked Exception)。

Error和Exception的区别

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

 

 

 

异常处理的两个基本原则

 

第一,尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常,在这里是Thread.sleep()抛出的InterruptedException。 这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作的艺术,所以我们有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛 的Exception之类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望RuntimeException被扩散出来,而不是被捕获。 进一步讲,除非深思熟虑了,否则不要捕获Throwable或者Error,这样很难保证我们能够正确程序处理OutOfMemoryError。

 

第二,不要生吞(swallow)异常。这是异常处理中要特别注意的事情,因为很可能会导致非常难以诊断的诡异情况。 生吞异常,往往是基于假设这段代码可能不会发生,或者感觉忽略异常是无所谓的,但是千万不要在产品代码做这种假设! 如果我们不把异常抛出来,或者也没有输出到日志(Logger)之类,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异 常。

 

 

OutOfMemoryError内存溢出一般是出现在申请了较多的内存空间没有释放的情形。

//java.lang.OutOfMemoryError  -Xmx150mtry {    byte[] b = new byte[1024*1024*600];} catch (OutOfMemoryError e) {    e.printStackTrace();}

运行时,设置jvm最大的heap内存150m,此时申请600m的内存,因此会报error

java.lang.OutOfMemoryError: Java heap space

 

java.lang.StackOverflowError

堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

public static void main(String[] args) {    method();} public static void method() {    while (true) {        method();    }}

无限次的递归调用出现

Exception in thread "main" java.lang.StackOverflowError

 

 

常见的异常;

ArrayIndexOutOfBoundsException 数组下标越界异常,

ArithmaticException 算数异常 如除数为零

NullPointerException 空指针异常

IllegalArgumentException 不合法参数异常

 

转载于:https://www.cnblogs.com/alter888/p/11229782.html

你可能感兴趣的文章
关于Staltstack
查看>>
Flask 蓝图&单元测试
查看>>
/etc/fstab格式的问题
查看>>
js apply/call/caller/callee/bind使用方法与区别分析
查看>>
未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"
查看>>
18.11.2 考试总结
查看>>
作业五 循环结构
查看>>
第十三次作业
查看>>
Django简介
查看>>
建立Socket Policy服务器
查看>>
BZOJ2563 阿狸和桃子的游戏
查看>>
.net体系结构——C#高级编程第一章
查看>>
mysql共享锁与排他锁
查看>>
Cmd命令
查看>>
面试题:计算 n!阶乘的结果的末尾有几个0
查看>>
App、小程序、H5,这三者该如何抉择?
查看>>
tsp的理论和实践(10)tsp系列暂停一下
查看>>
autoreleasepool底层探索
查看>>
Oracle常见五个服务的作用
查看>>
leetcode之53.最大子序和
查看>>