您的位置:首页 > 编程语言 > Java开发

[疯狂Java讲义精粹] 第八章|异常处理

2012-12-30 20:53 246 查看
0. Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字.

try关键字后紧跟一个花括号括起来的代码块(花括号不能省略), 它里面放置可能引发异常的代码.
catch后对应异常类型和一个代码块, 用于表明该catch块用于处理这种类型的代码块.
多个catch块后还可以跟一个finally块, finally块用于回收在try块里打开的物理资源, 异常机制会保证finally块总被执行.
throws关键字主要在方法签名中使用, 用于声明该方法可能抛出的异常.
throw用于抛出一个实际的异常, throw可以单独作为语句使用, 抛出一个具体的异常对象.

1. Java异常(Java所有非正常情况分两类: 异常(Exception)和错误(Error), 都继承Throwable父类)分为两类, Checked异常 和 Runtime异常. Java认为Checked异常都是可以在编译阶段被处理的异常, 所以它强制程序处理所有的Checked异常; 而Runtime异常则无需处理.

*所有的RuntimeException类及其子类的实例被称为Runtime异常, 其他异常类的实例被称为Checked异常.
*只有Java语言提供了Checked异常(肯定假的~). Java认为Checked异常都是可以被处理(修复)的异常, 所以Java程序必须显式处理Checked异常, 否则编译时就会出现错误.
Checked异常处理方式: a. try了这句; b. 定义该方法时声明抛出(throws)该异常.
Runtime异常无需显式声明抛出, 如果程序需要捕获Runtime异常, 也可以用try...catch块实现.

2. 如果执行try块里的业务实现代码时出现异常, 系统自动生成一个异常对象, 该异常对象被提交给Java运行时环境, 这个过程被称为抛出(throw)异常;
当Java运行时环境收到异常对象时, 会寻找能处理该异常对象的catch块, 如果找到, 则把该异常对象交给catch块处理, 这个过程称为捕获(catch)异常;
如果Java运行时环境找不到能捕获异常的catch块, 则运行时环境终止, Java程序也将退出.
//伪代码
try
{
//业务实现代码
...
}
catch (Exception e)
{
alert 输入不合法
goto retry
}


3. try块被执行一次后, 对应的catch中最多只能有一个被执行(如果都符合条件的话, 执行第一个.).

4. try块里声明的是代码快内局部变量, 只在try块中有效, catch块和finally块中不能访问.

5. Java所有非正常情况分两类: 异常(Exception) 和 错误(Error), 都继承Throwable父类. 其中Error错误, 一般指与虚拟机相关的问题, 如系统崩、虚拟机错误、动态连接失败等, 这种错误无法恢复或不可能捕获, 导致程序中断. 通常应用程序无法处理这些错误, 因此应用程序不应该试图使用catch块来捕获Error对象.定义该方法时, 也无需在其throws子句中声明该方法可能抛出Error及其任何子类. 异常分为两类, Checked异常 和 Runtime异常.
Java认为Checked异常都是可以在编译阶段被处理的异常, 所以它强制程序处理所有的Checked异常; 而Runtime异常不强制.



-------------------------------------------------------------------------------
上面这么多就是说, 编码时只处理Checked异常就好了. Over.

6. 所有父类异常的catch块都应该放在子类异常catch块后面, 否则编译错误.

7. 常见异常:

IndexOutOfBoundsException: 数组越界异常, 运行时输入的参数不够.
NumberFormatException, 数字格式异常, 例如需要数字却输入字母.
ArithmeticException, 算数异常, 例如 0作被除数.
NullPointerException, 空指针异常, 调用null对象的实例方法或实例变量是发生.

8. Java7之后, 一个catch块可以捕获多种类型的异常:

多种异常类型之间用竖线(|)隔开.
捕获多种类型的异常时, 异常变量有隐式的final修饰, 因此程序不能对异常变量赋新值.

9. 所有异常对象都包含这几个方法:

getMessage(): 返回该异常的纤细描述字符串.
printStackTrace(): 将该异常的跟踪栈信息输出到标准错误输出.
printStackTrace(PringStream s): 将该异常的跟踪栈信息输出到指定的输出流.
getStackTrace(): 返回该异常的跟踪栈信息.

10. try执行, 对应的finally块总是会被执行, 甚至try块或catch块中已经执行了return语句. (但是用System.exit(1); 语句代替return;则不会执行finally块. 因为System.exit(1)是退出虚拟机用的, 哈哈.)

11. 一般别再finally块中使用return或throw等导致方法终止的语句, 一旦使用, try块和catch块中的return和throw语句全部失效(不是这一句"失效", 而是这样: 系统执行到try或catch块的return或throw语句时并不立即结束该方法, 而是先寻找有木有finally块, 没有的话就执行return或throw语句结束该方法; 有的话就先执行finally块, 如果finally块中没有return或throw语句的话, 就在执行完finally块后跳转到try或catch中的return或throw语句,
如果有, 就直接在finally块中结束了这个方法了. ).

12. Java7后, 允许在try关键字后紧跟一对圆括号, 括号内可以声明、初始化一个或多个资源(通常是数据库连接、网络连接等), 在try语句结束时将自动关闭这些资源. (为了保证可以正常关闭, 这些资源实现类必须实现AutoCloseable或Closeable接口, 实现着两个接口就必须实现close()方法.)

13. try块后面必须有catch块或finally块或同事都有, 除了使用自动关闭资源的try(就是try后带括号的)语句时.

14. 使用throws声明抛出异常, 表示当前方法不处理异常, 而将其交给上一级调用者处理; main方法也可以不处理而把异常交给JVM处理(JVM会打印异常的跟踪栈信息, 并中止程序运行.).

15. throws声明抛出只能在方法签名中使用, throws可以声明抛出多个异常类, 多个异常类之间以逗号隔开.
class a
{
void a() throws ExceptionClass1, ExceptionClass2 {}
}


16. 可以使用throw语句在程序中自行抛出异常, throw语句抛出异常实例(不是异常类), 而且每次只能抛出一个异常实例.
throw ExceptinInstance;


17. Checked异常要被捕获或者在声明方法时显式throws, Runtime异常则不用.

18. Java7以后, 才可以这样...
try
{
...
}
catch (ExceptionClass ec)
{
...
throw ec;   //把已经捕获的异常再次抛出.
}


19. 面向对象的程序在运行时, 经常会发生一系列方法调用, 从而形成"方法调用栈". <----- "异常跟踪栈" 也是类似意思.

20.
try
{
...
}
catch (Throwable t)
{
...
}
这样的Catch All语句是一种通过避免错误处理而加快变成进度的机制, 不能滥用.

----------------------------------------
Over. 书看太太慢了..
----------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: