Java异常处理

本文主要总结于Java疯狂讲义。

    Java的异常机制主要依赖于try,catch,finally,throw和throws五个关键字,其中try关键字后紧跟一个花括号(不可省略),简称try块,它里面放置可能引发异常的代码。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。多个catch块后面可以跟一个finally块,用于回收try块打开的物理资源等收尾工作,异常处理机制会保证finally块总被执行。throws关键字主要在方法签名中使用,用于声明该方法可能抛出的的异常,throw用于抛出一个实际的异常。异常处理机制可以将业务代码与错误处理代码分离,提高容错性并提高程序的健壮性。

1,使用try .....catch....捕获异常

Java是把系统的业务实现代码放在try块中,所有的异常处理逻辑放在catch块中处理,语法结构如下:

try
{
// 业务实现代码
...
}
catch(Exception e){
alert 提升错误原因
goto retry
}

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

需要再次说明的是,一个try语句后面可以有多个catch语句。

 

2,异常类的继承体系

Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。error错误一般只与虚拟机相关的问题,如系统崩溃,虚拟机错误等,这种错误无法恢复或不可捕获,将导致程序中断,通常应用程序无法处理这些错误。

进行异常捕获时,所有父类异常的catch块应该排在子类异常的catch块的后面,简称先处理小异常,再处理大异常,否则将出现编译错误。如下代码所示:

try
{
statements....
}
catch(RuntimeException e){
    System.out.println("运行时异常"); // 1
}
catch(NullPointerException ne){
    System.out.println("空指针异常");  // 2
}

上面的代码有两个catch语块,因为1处的RuntimeException已经包含了NullPointerException异常,所以2处的catch语块没有执行的机会。捕获时一定要记得先捕获小异常,再捕获大异常。

从java7开始一个catch块可以捕获多种类型的异常,多种异常类型之间用竖线隔开,捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序变量重新赋值。

3,使用finally回收资源

有时候,程序在try块里打开了一些物理资源(例如数据库连接,网络连接),这些物理资源都必须显式回收。不管try块的代码是否异常,finally都会执行。完整的异常处理语法结构如下:

try
{
// 业务实现代码
...
}
catch(Exception e){
alert 提升错误原因
goto retry
}
finally
{
// 资源回收
...
}

异常处理只有try是必须的,但catch和finally至少出现其中之一。一般情况下,finally语句都会执行,除非在try或catch语句中调用了退出虚拟机的方法。

4,使用throws声明抛出异常

使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上级调用者处理;一旦使用throws语句声明抛出异常,程序就无需使用try...catch块来捕获异常了。使用throws声明抛出异常时有一个限制:子类方法声明的异常类型应该是父类方法声明抛出的异常类的子类或相同,不允许比父类方法声明抛出的异常多。

如果需要在程序中自行抛出异常,则应该使用throw语句(注意没有s),throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值