异常知识点
常见格式:
try{ //可能异常代码块 }catch(捕获的异常类型){ //异常处理语句 }finally{ //一定要执行的代码 //一般用来关闭关闭流,数据库 } //捕获异常处理
运行流程
从上图可以发现finally语句必须执行
异常的分类如下所示
-
Thrawable/可抛出的异常
-
Exception/异常
-
编译时异常(受检异常)/Exception下,除了RuntimeException外所有
-
运行时异常(非受检异常)/RuntimeException
-
-
Error/错误
-
注意!
-
编译时异常,大多需要我们try-catch;
-
运行时异常,不需要强制try-catch,在发现错误后,修改错误(直接解决)。
常见运行异常:
名称 | 显示语句 |
---|---|
空指针 | NullpointerException |
数组下标越界 | ArrayIndexOutOfBoundsException |
转型错误 | ClassCastException |
算术异常 | ArithmeticException |
printStackTrace();
e.printStackTrace(); //打印异常的栈,该方法在Throwable中,其子类没有重写
在查看printStackTrace()打印出的语句时,从最后往前看
多个异常的处理
1. 直接捕获父类异常
catch(Exception e){} //或者 catch(Thrawable e){}
2.多个异常依次捕获,多个catch块
try{ }catch(异常1){ }catch(异常2){ }catch(异常3){ }
注意:
-
多个异常依次捕获需要注意异常的顺序
最大的异常最后,父类异常放在最后处理.
-
多个异常捕获,只会根据顺序进入一个catch块
3.JDK1.8后
catch(异常1 | 异常2 | 异常3){ }
注意:
在catch中的异常为同级关系,不允许存在父子关系
其他书写形式
-
try{ }finally{ }
-
try{ }catch{ }catch{ }finally{ }
-
try{ }catch{ }catch{ }
注意!以下书写方式不正确
-
try{ }
-
finally{ }
有趣的练习
1.
int x = 1; try { System.out.println("A"); return ++ x; } catch (Exception e) { System.out.println("D"); } finally { System.out.println("B"); ++x; } System.out.println("C"); return x;
上题的输出结果为
A
B
y = 2
2.
String aa = "aa"; try { aa = "bb"; return aa; } catch (Exception e) { e.printStackTrace(); } finally { aa = "cc"; return aa; }
上题的输出结果为
y = cc