异常处理早已成为衡量一门语言是否成熟的标志之一。增加异常处理机制后的程序有更好的容错性,以及健壮性。
public static void main(String[] args) {
try {
int x = 10/0;
} catch (Exception e) {
e.printStackTrace();
}
}
1、发生异常后catch处理方式
当java运行时收到异常对象时,寻找能处理该异常对象的catch块,若能找到合适的则交给catch块处理,这个过程称为捕获异常;如果Java运行时没有找到捕获异常的catch块,则运行时环境终止,Java程序也将退出。
2、try=》catch,关系1...n
一个try可以对应多个catch块,而且catch块的处理顺序应该先小后大。原因是如果大的异常放到前面,小的异常catch将永远无法得到执行。
3、catch=》异常类型,关系1...n
从java7之后一个catch块可以通过|(竖线)捕获多个类型的异常。
一共有四种方式
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();
}
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()方法。