情况描述:当程序出现bug时,Java虚拟机发现异常,虚拟机就会new出来一个新的对象,用类似返回的方式返回错误类型和异常原因,同时中断程序。
处理异常
对异常进行处理,捕获异常,避免异常返回使程序中断
try{//有可能发生异常的代码}catch(异常类型1 对象名1){//异常的操作}catch(异常类型1 对象名1){//异常的操作}...finally{//异常的统一出口}
catch语句相当于if语句
如果满足异常类型,则实现代码块里面的操作
易错警告
eg1.
package com.java.demo1;public class Demo6 {public static void main(String[] args) {Person p =haha();System.out.println(p.age);}public static Person haha(){Person p = new Person();try{p.age = 18;return p;}finally{p.age = 28;}}static class Person{int age;}}//始终是一个对象,最后执行finally,p.age年龄被更改
eg2.
package com.java.demo1;public class Demo7 {public static void main(String[] args) {int a =haha();System.out.println(a);}public static int haha(){int a = 10;try{return a;}finally{a = 20;}}}//return a;中的a是被备份的那个//实际上又开辟了一块内存空间,这是返回的a和finally中的赋值的a无关
eg3.
package com.java.demo1;public class Demo8 {public static void main(String[] args) {haha();}public static void haha(){try{int a = 10;int b = 0;System.out.println(a/b);}catch(Exception e){//退出JVMSystem.exit(0);}finally {System.out.println("锄禾日当午,汗滴禾下土");}}}
唯一一种在代码中使finally不执行的代码就是上述eg3.
System.exit(0);
总结:finally问题总绕不开两点:
1.finally必然执行
2.return的时机以及备份的具体内容
