错误(Error):表示恢复不是不可能但是很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
异常(Exception):表示一种设计或实现问题。也就是说,它表示程序运行正常,从不会发生的情况。
错误-----没有通过编译,在编译时出错。
异常-----通过编译,在运行中出错。
1 try{ 2 可能出现异常的代码块 3 return ***; 4 }catch(异常对象){ 5 一旦try中出现了异常则执行 6 return ***; 7 }finally{ 8 无论是否出现异常都会执行 9 }
注意:catch块中必须有和try块中return相同类型的return。
在一个方法里,return永远是最后一步。
异常最大类:Exception。
所有用native修饰的,调用的都是底层系统的方法,没有方法体。
java规范:不允许用异常做流程控制。
finally代码块里的内容什么时候被执行,在retutn钱还是在return后?
先来一段代码:
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的值进行压栈,并输出结果
若有错误之处,欢迎指正。谢谢!