错误(Error):表示恢复不是不可能可是很困难的状况下的一种严重问题。好比说内存溢出。不可能期望程序能处理这样的状况。java
异常(Exception):表示一种设计或实现问题。也就是说,它表示程序运行正常,从不会发生的状况。ide
错误-----没有经过编译,在编译时出错。spa
异常-----经过编译,在运行中出错。设计
1 try{ 2 可能出现异常的代码块 3 return ***; 4 }catch(异常对象){ 5 一旦try中出现了异常则执行 6 return ***; 7 }finally{ 8 不管是否出现异常都会执行 9 }
注意:catch块中必须有和try块中return相同类型的return。code
在一个方法里,return永远是最后一步。对象
异常最大类:Exception。blog
全部用native修饰的,调用的都是底层系统的方法,没有方法体。内存
java规范:不容许用异常作流程控制。字符串
finally代码块里的内容何时被执行,在retutn钱仍是在return后?io
先来一段代码:
1 public class A{ 2 public static int add(int a,int b){ 3 try{ 4 int c=a+b; 5 System.out.println("try"); 6 return c; 7 }catch(Exception e){ 8 System.out.println("catch"); 9 return 0; 10 }finally{ 11 System.out.println("finally"); 12 } 13 } 14 public static void main(String[] args){ 15 System.out.println(add(1,2)); 16 } 17 } 18 结果: 19 try 20 finally 21 3
经过反汇编命令javap -c A,能够获得下图:
能够看出,finally中的代码块是在return中间执行的。
下面来讲说正常状况:
1~9:首先把a和b的值压栈,放到操做数栈的栈顶,而后相加,并把结果给了c,接下来把字符串try放到栈顶并输出
12~19:把c的值压栈,放到栈顶,而后再把栈顶的值给了c,而后在把字符串finally放到栈顶并输出
22~23:把c的值进行压栈,并输出结果
如有错误之处,欢迎指正。谢谢!