A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这篇文章主要介绍了深入剖析Java中的各种异常处理方式,是Java入门学习中的基础知识,需要的朋友可以参考下
1. 调试追踪代码:




?

1
2
3
4
5
6
7
8
9
10
11

public static void enterTryMethod() {
  System.out.println("enter after try field");
}
  
public static void enterExceptionMethod() {
  System.out.println("enter catch field");
}
  
public static void enterFinallyMethod() {
  System.out.println("enter finally method");
}


2. 抛出Exception,没有finally,当catch遇上return

   




?

1
2
3
4
5
6
7
8
9
10
11
12

public static int catchTest() {
    int res = 0;
      
    try {
      res = 10 / 0; // 抛出Exception,后续处理被拒绝
      enterTryMethod();
      return res; // Exception已经抛出,没有获得被执行的机会
    } catch (Exception e) {
      enterExceptionMethod();
      return 1;  // Exception抛出,获得了调用方法并返回方法值的机会
    }
  }


后台输出结果:




?

1
2

enter catch field
1


3. 抛出Exception,当catch体里有return,finally体的代码块将在catch执行return之前被执行


   




?

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public static int catchTest() {
    int res = 0;
      
    try {
      res = 10 / 0; // 抛出Exception,后续处理被拒绝
      enterTryMethod();
      return res; // Exception已经抛出,没有获得被执行的机会
    } catch (Exception e) {
      enterExceptionMethod();
      return 1;  // Exception抛出,获得了调用方法并返回方法值的机会
    } finally {
      enterFinallyMethod(); // Exception抛出,finally代码将在catch执行return之前被执行
    }
  }


后台输出结果:




?

1
2
3

enter catch field
enter finally method
1


4. 不抛出Exception,当finally代码块里面遇上return,finally执行完后将结束整个方法




?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public static int catchTest() {
  int res = 0;
   
  try {
    res = 10 / 2; // 不抛出Exception
    enterTryMethod();
    return res; // 获得被执行的机会,但执行需要在finally执行完成之后才能被执行
  } catch (Exception e) {
    enterExceptionMethod();
    return 1;
  } finally {
    enterFinallyMethod();
    return 1000; // finally中含有return语句,这个return将结束这个方法,不会在执行完之后再跳回try或者catch继续执行,方法到此结束
  }
}


后台输出结果:




?

1
2
3

enter after try field
enter finally method
1000


5. 不抛Exception,当finally代码块里面遇上System.exit()方法将结束和终止整个程序,而不只是方法







?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public static int catchTest() {
  int res = 0;
   
  try {
    res = 10 / 2; // 不抛出Exception
    enterTryMethod();
    return res; // 获得被执行的机会,但由于finally已经终止程序,返回值没有机会被返回
  } catch (Exception e) {
    enterExceptionMethod();
    return 1;
  } finally {
    enterFinallyMethod();
    System.exit(0); // finally中含有System.exit()语句,System.exit()将退出整个程序,程序将被终止
  }
}


后台输出结果:




?

1
2

enter after try field
enter finally method


6. 抛出Exception,当catch和finally同时遇上return,catch的return返回值将不会被返回,finally的return语句将结束整个方法并返回

   




?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public static int catchTest() {
   int res = 0;
     
   try {
     res = 10 / 0; // 抛出Exception,后续处理将被拒绝
     enterTryMethod();
     return res; // Exception已经抛出,没有获得被执行的机会
   } catch (Exception e) {
     enterExceptionMethod();
     return 1; // Exception已经抛出,获得被执行的机会,但返回操作将被finally截断
   } finally {
     enterFinallyMethod();
     return 10; // return将结束整个方法,返回值为10
   }
}


后台输出结果:




?

1
2
3

enter catch field
enter finally method
10


7. 不抛出Exception,当finally遇上return,try的return返回值将不会被返回,finally的return语句将结束整个方法并返回

   




?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public static int catchTest() {
   int res = 0;
     
   try {
     res = 10 / 2; // 不抛出Exception
     enterTryMethod();
     return res; // 获得执行机会,但返回将被finally截断
   } catch (Exception e) {
     enterExceptionMethod();
     return 1;
   } finally {
     enterFinallyMethod();
     return 10; // return将结束整个方法,返回值为10
   }
}


后台输出结果:




?

1
2
3

enter after try field
enter finally method
10



结论
Java的异常处理中,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块

    如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法
    如果有finally代码块,此时程序执行到try代码块里的return一句之时并不会立即执行return,而是先去执行finally代码块里的代码

若finally代码块里没有return或没有能够终止程序的代码,程序在执行完finally代码块代码之后再返回try代码块执行return语句来结束整个方法。若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就OK了。

1 个回复

倒序浏览
好乱 看不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马