5、Java入门—异常与异常处理

异常:


java中的异常体系结构;throwable总源  error exception
runtimeexception非检查异常   检查异常




1.Java中的所有不正常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类;
2.其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;
3.Exception类主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)
4.RuntimeException异常主要包括以下四种异常:空指针异常、数组下标越界异常、类型转换异常、算术异常,这类异常基本都是代码逻辑的问题。
5.检查异常主要包括:文件异常(IOException)、SQL异常(SQLException),这类异常外部环境的问题(非代码本身的问题),需要捕获。

处理异常的方法,try-catch以及try-catch-finally.
多重catch语句中,要按先小后大的顺序写catch语句。由子--->父就近处理,父类异常放在最后面的
finally语句块做一些善后工作,写一些最终要执行的代码。


try-catch-finally-return的执行顺序

情况1:try块中没有抛出异常try和finally块中都有return语句

[java]  view plain  copy
  1. public static int NoException(){  
  2.  int i=10;  
  3.  try{  
  4.   System.out.println("i in try block is"+i);  
  5.   return --i;  
  6.  }catch(Exception e){  
  7.   --i;  
  8.   System.out.println("i in catch - form try block is"+i);  
  9.   return --i;  
  10.  }finally{  
  11.     
  12.   System.out.println("i in finally - from try or catch block is"+i);  
  13.   return --i;  
  14.  }  
  15. }  


执行结果:

i in try block is10
i in finally - from try or catch block is9
the method value is8

执行顺序:执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main 方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值

 

情况2:try块中没有抛出异常,仅try中有return语句

代码:

[java]  view plain  copy
  1. public static int NoException(){  
  2.     int i=10;  
  3.     try{  
  4.         System.out.println("i in try block is--"+i);  
  5.         return --i;  
  6.     }catch(Exception e){  
  7.         --i;  
  8.         System.out.println("i in catch - form try block is--"+i);  
  9.         return --i;  
  10.     }finally{  
  11.           
  12.         System.out.println("i in finally - from try or catch block is--"+i);  
  13.         --i;  
  14.         System.out.println("i in finally block is--"+i);  
  15.         //return --i;  
  16.     }  
  17. }  


执行结果:

i in try block is--10
i in finally - from try or catch block is--9
i in finally block is--8
the method value is--9

顺序:try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值

 

情况3:try块中抛出异常try,catch,finally中都有return语句

代码:

[java]  view plain  copy
  1. public static int WithException(){  
  2.     int i=10;  
  3.     try{  
  4.         System.out.println("i in try block is--"+i);  
  5.         i = i/0;  
  6.         return --i;  
  7.     }catch(Exception e){  
  8.         System.out.println("i in catch - form try block is--"+i);  
  9.         --i;  
  10.         System.out.println("i in catch block is--"+i);  
  11.         return --i;  
  12.     }finally{  
  13.           
  14.         System.out.println("i in finally - from try or catch block is--"+i);  
  15.         --i;  
  16.         System.out.println("i in finally block is--"+i);  
  17.         return --i;  
  18.     }  
  19. }  


执行结果:

i in try block is--10
i in catch - form try block is--10
i in catch block is--9
i in finally - from try or catch block is--8
i in finally block is--7
the method value is--6

顺序,抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6

 

情况4,catch中有return,finally中没有,同上,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值

情况5:try和catch中都有异常,finally中无return语句

[java]  view plain  copy
  1. public static int CatchException(){  
  2.     int i=10;  
  3.     try{  
  4.         System.out.println("i in try block is--"+i);  
  5.         i=i/0;  
  6.         return --i;  
  7.     }catch(Exception e){  
  8.         System.out.println("i in catch - form try block is--"+i);  
  9.         int j = i/0;  
  10.         return --i;  
  11.     }finally{  
  12.           
  13.         System.out.println("i in finally - from try or catch block is--"+i);  
  14.         --i;  
  15.         System.out.println("i in finally block is--"+i);  
  16.         //return --i;  
  17.     }  
  18. }  


结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
Exception in thread "main" Java.lang.ArithmeticException: / by zero
 at exception.ExceptionTest0123.CatchException(ExceptionTest0123.java:29)
 at exception.ExceptionTest0123.main(ExceptionTest0123.java:17)

执行顺序:在try块中出现异常,到catch中,执行到异常,到finally中执行,finally执行结束后判断发现异常,抛出

 

情况6:try,catch中都出现异常,在finally中有返回

[javascript]  view plain  copy
  1. public static int CatchException(){  
  2.     int i=10;  
  3.     try{  
  4.         System.out.println("i in try block is--"+i);  
  5.         i=i/0;  
  6.         return --i;  
  7.     }catch(Exception e){  
  8.         System.out.println("i in catch - form try block is--"+i);  
  9.         int j = i/0;  
  10.         return --i;  
  11.     }finally{  
  12.           
  13.         System.out.println("i in finally - from try or catch block is--"+i);  
  14.         --i;  
  15.         System.out.println("i in finally block is--"+i);  
  16.         return --i;  
  17.     }  
  18. }  


运行结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
the method value is--8

执行顺序:try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常

 

没有catch,只有try和finally时,执行顺序和上面的几种情况差不多,只是少了catch块的执行

try 语句块不可以独立存在,必须与 catch 或者 finally  块同存

异常的抛出:

throw是抛出异常的动作(异常对象),且出现在方法体中;

throws则是方法头,出现在方法体外,向上抛出异常(可以是多个,用逗号隔开),自己不处理


自定义异常
class 自定义异常类 extends 异常类型{
}


异常链表: 利用新异常,使用initCause()连接到原异常
只有Error,Exception,RuntimeException提供了带cause参数的构造器,其他的所有异常类只能通过initCause()来设置cause。
所有Throwable的子类构造器中都可以接受一个cause对象作为参数。cause是异常原由,代表着原始异常。既可以在当前位置创建并抛出行的异常,也可以通过cause追踪到异常最初发生的位置。
异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。
把捕获的异常包装成新的异常,在新异常里添加原始的异常,并将新异常抛出,它们就像是链式反应一样,一个导致(cause)另一个
这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,(将所有捕获到的异常包装为新的异常类,即定义在相同的抽象层次上抛出)但不会丢弃更低层次的信息。




异常在实际应用中的经验与总结:
1.处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2.在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
3.对于不确定的代码,也可以加上try-catch,处理潜在的异常
4.尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
5.具体如何处理异常,要根据不同的业务需求和异常类型去决定 
6.尽量添加finally语句块去释放占用的资源











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值