情况描述:当程序出现bug时,Java虚拟机发现异常,虚拟机就会new出来一个新的对象,用类似返回的方式返回错误类型和异常原因,同时中断程序。

处理异常

对异常进行处理,捕获异常,避免异常返回使程序中断

  1. try{
  2. //有可能发生异常的代码
  3. }catch(异常类型1 对象名1){
  4. //异常的操作
  5. }catch(异常类型1 对象名1){
  6. //异常的操作
  7. }...
  8. finally{
  9. //异常的统一出口
  10. }

catch语句相当于if语句
如果满足异常类型,则实现代码块里面的操作

易错警告
eg1.

  1. package com.java.demo1;
  2. public class Demo6 {
  3. public static void main(String[] args) {
  4. Person p =haha();
  5. System.out.println(p.age);
  6. }
  7. public static Person haha(){
  8. Person p = new Person();
  9. try{
  10. p.age = 18;
  11. return p;
  12. }finally{
  13. p.age = 28;
  14. }
  15. }
  16. static class Person{
  17. int age;
  18. }
  19. }
  20. //始终是一个对象,最后执行finally,p.age年龄被更改

eg2.

  1. package com.java.demo1;
  2. public class Demo7 {
  3. public static void main(String[] args) {
  4. int a =haha();
  5. System.out.println(a);
  6. }
  7. public static int haha(){
  8. int a = 10;
  9. try{
  10. return a;
  11. }finally{
  12. a = 20;
  13. }
  14. }
  15. }
  16. //return a;中的a是被备份的那个
  17. //实际上又开辟了一块内存空间,这是返回的a和finally中的赋值的a无关

eg3.

  1. package com.java.demo1;
  2. public class Demo8 {
  3. public static void main(String[] args) {
  4. haha();
  5. }
  6. public static void haha(){
  7. try{
  8. int a = 10;
  9. int b = 0;
  10. System.out.println(a/b);
  11. }
  12. catch(Exception e){
  13. //退出JVM
  14. System.exit(0);
  15. }finally {
  16. System.out.println("锄禾日当午,汗滴禾下土");
  17. }
  18. }
  19. }

唯一一种在代码中使finally不执行的代码就是上述eg3.
System.exit(0);
总结:finally问题总绕不开两点:
1.finally必然执行
2.return的时机以及备份的具体内容