java基础(四)之java浅析异常处理机制

引言:

异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。我们在处理文件时,需要考虑文件不存在等各种极端异常情况,这样才能更好的保证程序的健壮性。


一.异常的基本概念与分类


1.基本概念

       Throwable: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。有两个重要的子类:Exception(异常)和Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。


      1)  Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。


      2)  Exception(异常):是程序本身可以处理的异常。


   注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。具体概念等信息,可以看这篇文章异常处理机制


2.分类


二.异常的用法及若干注意事项

1.try catch finally 用法

try
{    //业务实现逻辑

    ...
}
catch(SubException e)
{
    //异常处理块1
    ...
}
catch(SubException2 e)
{
    //异常处理块2
    ...
}
    ...
finally
{
   //资源回收块
    ...
}
1)在java语言中,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语句中。
2)当程序执行出现异常的时候,系统会抛出一个异常,然后由try{}语句中中出现异常的地方转到catch{}语句中。不过不管有没有异常产生,finally{}中的语句都将执行。
3)如果系统出现系统错误或者运行Runtime异常,jvm会结束程序运行,不一定会执行finally{}中的语句。
4)如果try{}中产生的异常在catch中没有处理,系统将停止程序,也不会执行finally中的语句。

5)如果存在多个异常,则安排顺序逐个匹配,匹配到则进行该异常代码处理,其他异常则不执行,相当于选择最近最合适的异常处理。所以越顶层的异常需要放在越后面。

2.若干注意事项

1)不要在finally块中使用renturn或throw等导致方法终止的语句,因为一旦使用,将会导致try块、catch块中的return、throw语句失效。

这里其实很好理解,在异常处理结束(return,throw等语句)之前进行finaly块处理。如果finally块中存在相应的结束语句(return,throw),则会先执行完成,导致catch块中相应结束语句失效。

public class testException {
public static void main(String[]args){
	test();
}
public static  void test(){
	int a=3;
	try{
	int s=a/0;
	System.out.println(s);}
catch(Exception e){
	System.out.println("执行catch");
	throw new RuntimeException("catch 中抛出的异常");
}
	finally{
	System.out.println("执行finally");
	throw new RuntimeException("finally 中抛出的异常");
	}
}
}
程序执行结果:
Exception in thread "main" 执行catch
执行finally
java.lang.RuntimeException: finally 中抛出的异常
#如果finally中加入return语句,效果类似。
2) finally块不执行的情况:程序中使用退出语句system.exit(-1),硬件故障

package Server;
public class testException {
public static void main(String[]args){
	test();
}
public static  void test(){
	int a=3;
	try{
	int s=a/0;
	System.out.println(s);}
catch(Exception e){
	System.out.println("执行catch,即将退出");
	System.exit(-1);
	throw new RuntimeException("catch 中抛出的异常");
}
	finally{
	System.out.println("执行finally");
	}
}
}
执行结果:
执行catch,即将退出

三.如何自定义异常及处理原则

1.自定义异常

对应上面的异常分类, 选择你要自定义的异常父类,我这里以RuntimeException

public class myException extends RuntimeException {
public myException(String mseg){
super(mseg);
}
}
2.抛出异常

使用throw关键字抛出异常,如 throw new Exception("my exception.....")

3.处理原则

知道如何处理该异常则在本层进行异常处理,不知道如何处理则抛出异常交给上一层调用者进行处理.

四.异常的其他应用场合

在java中break语句只能退出当前循环,然后对于多层循环无法退出,这时可以巧妙的利用异常进行多层循环退出

public class testException {
public static void main(String[]args){
	process();
}
public static  void process(){
	int i=0;
try{
while(true){
while(true){
	i+=1;
	System.out.println("i="+i);
	if(i==3)
	{
		throw new Exception("退出循环");
	}
}	
}
}
catch(Exception e){
	System.out.println("真的退出来了.....");
}
}
}
执行结果: 
i=1
i=2
i=3
真的退出来了.....


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值