Java异常

来源:互联网 发布:windows monaco 字体 编辑:程序博客网 时间:2024/05/18 02:16

Def:异常是指程序运行过程中可能出现的非正常状态。Java异常可以分为两类:可检查异常和非检查异常。

可检查异常:Checked异常。非可检查异常:Runtime异常和Error。

Checked异常:是指可以在编译阶段被处理的异常,所以它强制程序处理所有的Checked异常。

Runtime异常:是运行时异常,表示虚拟机的通常操作中可能存在的异常,是一种的常见的运行错误,无须强制处理。

Error:Error子类之所以属于非检测异常是因为:无法预知它们的产生时间。若Java应用程序内存不足,则随时可能出现OutOfMemoryError;起因一般不是应用程序中的特殊调用,而是JVM自身的问题。另外,Error类一般表示应用程序无法解决的严重问题,故将这些类视为非检测异常。


Java异常处理机制主要依赖于五个关键字:try、catch、finally、throw、throws

try 关键字后紧跟一个花括号括起来的代码块,简称try块。它里面可置引发异常的代码。

catch后对应异常类型和一个代码块,用于表明catch块用于处理这种类型的代码块。后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。

throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。

throw则用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常的对象。

PS:为了保证一定能够回收try块中打开的物理资源,异常处理机制提供了finally块,无论try块中的代码是否出现异常,也不管在哪个catch块中被执行,finally块总会被执行。异常处理结构语法中只有try块是必须的,一旦没有try块,则不能出现catchfinally块,如果存在try块,则catch块和finally块都是可选的。但二者至少要出现其一。也可以同时出现多个catch块。catch块必须位于try块后面,而finally必须位于catch块后面(如果存在的话)。

当java程序执行try块,catch块,时遇到了return语句或throw语句,这两个语句都会导致该方法的立即结束,但是系统并不会立即执行这两个语句,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块程序立即执行return语句或throw语句,方法终止。反之,则系统会立即执行finally块——只有当finally块执行完后,系统才会再次跳回来执行try块,catch块里的returnthrow语句,如果同时在 finally块中也存在returnthrow语句,则finally块已经终止了方法,自然不存在系统再次跳转去执行trycatch块里的returnthrow语句。

使用throws声明抛出异常的思路是:当前方法不知道应该如何处理这种异常,该异常应该由上一级调用者处理,如果main方法也不知道如何处理这种异常类型。也可以使用throws声明抛出异常,把该异常交给javaJVM处理。

JVM对异常的处理方法:打印异常跟踪栈信息,并终止程序运行。

不能基于异常来重载方法。在父类中有异常说明,在子类中可以没有。


异常处理过程:如果执行try块里的业务逻辑代码时出现异常,系统自动会生成一个异常对象,该异常对象被提交给java运行环境,这个过程被称为抛出(throw)异常。当java运行环境收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的catch块并把该异常交给它处理,该过程被称为捕获异常;如果java运行环境找不到捕获异常的catch块,则运行环境终止,程序也将退出。


常用的运行时异常:

 ①illegalArgumentException ②ClassCastException ③IndexOutOfBoundException ④NullPointerException ⑤ArithmeticException

Java中StackOverflowError异常和OutOfMemoryError异常之间联系与区别:

①如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

②如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。






原创粉丝点击