java的异常一

写java代码,异常用的很多,但以前没有系统的去研究过,今天正好面试被一道异常题搞倒了,回家就把异常看了下,补补基础。
java中的异常类特别多,但我们关心只是以下类图中的部分。
[b][size=large][color=brown]java异常类的体系层次结构[/color][/size][/b]
[img]http://chjl2020.iteye.com/upload/attachment/74253/7ef8fa47-9c03-338c-b32f-01c62c9b549c.jpg[/img]

从上图可以看出,所有的java异常都是从Throwable类派生而来的,主要分成两个分支,Error和Exception。
而Error体系描述的是java运行系统中的内部错误,出现这种异常,程序员基本是无能为力的,Error体系并不是我们需要太多研究的对象。剩下的就是Exception体系。

从类图中看,Exception体系也被分成两个主要分支,分别是IOException体系和RunTimeException体系。
RunTimeException体系异常指的是人为的编写出不合理的代码而导致的,
这些不合理的代码包括一下情况:
1:错误的类型转换。
2:数组越界访问。
3:访问空指针。
当出现以上情况的异常是,都说明是人为的代码问题,既然是人为的异常,自然要人为去避免。例如,

if(item < array.length)
{
System.out.println(t[item]);
}

我们事先判断要访问的元素是否超出了数组的长度,这样就能避免因为访问越界的数组而发生ArrayIndexOutOfBoundsException异常。
以上的Error体系和RunTimeException体系在java异常中都被称为[color=red]未检查异常[/color]。除了这两个体系异常,其他异常都称为[color=red]已检查异常[/color]

[b][color=brown][size=large]抛出异常[/size][/color][/b]
::当java中一个方法遇到自己无法处理的情况时,就应该抛出异常。

以下是java抛出一个异常的方法

public void fun_test()throws IOException
{
//....
throw new IOException();
}

通过先在方法名后面用[color=red]throws[/color]来声明要抛出的异常,然后再在方法体内用
通过new IOException()创建异常对象,并用[color=red]throw[/color]把他抛出。当有多个异常时,就用“,”分割开:

public void fun_test()throws IOException,AlreadyBoundException
{
//....
throw new IOException();

//....
throw new AlreadyBoundException();

}


对于已经捕获的异常,如果捕获处理后还需要往上抛出的话,也可以用[color=red]throw[/color]关键字把他再出抛出,如

public void fun_test()throws IOException{
try{
//...
}catch(IOException e)
{
//..
throw e
}
}

上面代码中虽然对IOException异常进行了捕获,处理后在catch块里继续把它往外抛.

[b][color=brown][size=large]捕获异常[/size][/color][/b]
java是通过try/catch或try/atch/finally代码快来捕获异常的。
具体如下:

try{
//....
}catch(Exception e)
{
//....
}



try{
//.......
}catch(Exception e)
{
//.....
}finally{
//......
}


try代码块里面抛出了异常,而这个异常又是catch里指定的异常类型,则程序会停止执行try块中剩下的代码,并跳出try代码块。转而执行catch块里面的代码,
如果try里没有出现异常,则程序会直接忽略catch代码块,如果try的任何代码出现异常,而这个异常又没有在catch里指定,则方法会立即退出。
注意::如果调用的方法声明了会抛出异常,必须对它的异常进行处理,要么通过try/catch捕获它并处理,要么声明会抛出该异常,把异常继续往上抛。
同样,如果所负责的业务逻辑没法对一个异常进行处理,最好就是把它往上抛,抛到有合适的地方再进行处理。

try/atch/finally
try/atch/finally代码快是先执行try块,如果try块没有异常,就接着执行finally块,如果try出现异常,则停止并跳出try块,转而执行catch里的代码,再接着执行finally块里的代码。
所以,不管try里有没有出现异常,finally块里的代码是一定会被执行的。但有点要注意
看下面代码:

public class ExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ExceptionTest.Exc());
}

public static String Exc()
{
try{
int i = 20/0;
}catch(Exception e)
{
System.out.println("出异常了");
return "返回catch";//在catch块里我们把函数return
}finally{
System.out.println("finally执行了");
}
return "正常返回";
}
}


打印的结果是:
[color=red]出异常了
finally执行了
返回catch[/color]

结果很明显,虽然在catch有return语句,并且catch块是比finally先执行的,但程序是先执行finally里的代码,再执行catch里的return 语句返回的。
(今天面试遇到这题,我误以为是先catch里的语句,因为catch有return所以直接返回,不会执行finally了,怪自己基础不扎实)。
(先写到这,找时间继续)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值