从零学Java——异常处理机制

前提

    异常处理早已成为衡量一门语言是否成熟的标志之一。增加异常处理机制后的程序有更好的容错性,以及健壮性。

异常的处理机制

1、使用try…catch捕获异常

public static void main(String[] args) {
		try {
			int x = 10/0;
		} catch (Exception e) {
			e.printStackTrace();
			
		}
	}

2、catch使用方式

    1、发生异常后catch处理方式

    当java运行时收到异常对象时,寻找能处理该异常对象的catch块,若能找到合适的则交给catch块处理,这个过程称为捕获异常;如果Java运行时没有找到捕获异常的catch块,则运行时环境终止,Java程序也将退出。

    2、try=》catch,关系1...n    

    一个try可以对应多个catch块,而且catch块的处理顺序应该先小后大。原因是如果大的异常放到前面,小的异常catch将永远无法得到执行。

   3、catch=》异常类型,关系1...n

   从java7之后一个catch块可以通过|(竖线)捕获多个类型的异常。

3、异常信息获取

一共有四种方式

1、getMessage();返回该异常的详细描述

2、printStackTrance();将异常的跟踪堆栈信息输出到标准错误输出

3、printStackTrance(PrintStream s);将该异常跟踪栈信息输出到指定输出流

4、getStackTrance();返回异常的跟踪栈信息

四种异常信息获取打印


getStackTrance中获取是一个数组,可以根据需要打印相关的详细内容。提供个大家一个工具类,把getStackTrance()转换为string类型打印

private static String getStackMsg(Exception e) {

		StringBuffer sb = new StringBuffer();
		StackTraceElement[] stackArray = e.getStackTrace();
		for (int i = 0; i < stackArray.length; i++) {
			StackTraceElement element = stackArray[i];
			sb.append(element.toString() + "\n");
		}
		return sb.toString();
	}

	private static String getStackMsg(Throwable e) {

		StringBuffer sb = new StringBuffer();
		StackTraceElement[] stackArray = e.getStackTrace();
		for (int i = 0; i < stackArray.length; i++) {
			StackTraceElement element = stackArray[i];
			sb.append(element.toString() + "\n");
		}
		return sb.toString();
	}

4、finally回收资源

1、finally作用

    当在程序的try中打开了一些物理资源(数据库连接,网络连接,磁盘文件),必须显式回收。当程序发生异常后,为了保证一定能回收try块中打开的物理资源,就可以使用finally块。无论try块中代码是否出现异常,也无论哪个catch块被执行,也无论try…catch中是否有return执行,finally块中的总会被执行。

2、当程序中有finally后return执行机制

   当try…catch中有return语句的时候,当执行到return语句,程序会检查是否有finally块,如果则先执行finally中的代码,之后则返回到return语句处继续执行,但是当程序中使用system.exit(1)会退出虚拟机导致finally中的代码无法执行。

   一旦finally中使用了return或者throw语句,会导致try,catch中return,throw语句失效。

3、添加finally会导致代码臃肿的问题,解决臃肿代码的问题

    在java7之后增加了try的功能,允许try关键字紧跟一对圆括号,在圆括号中可以声明,初始化多个资源,此处的资源表明必须在程序结束时显示关闭的资源。

    注意:为了保证try语句能够正常关闭这些资源,资源必须实现AutoCloseable或者Closeable接口,实现这两个接口就必须实现close()方法。

【总结】

    上述内容主要讲解try..catch..finally的使用方式,以及执行过程中需要一些注意事项。这一部分内容还是需要在实践过程中多多练习。关于异常还有异常类的一些内容,需要继续深入研究,下篇博文继续更新异常类的相关的内容。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mandy_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值