黑马程序员技术交流社区

标题: 测测你的Java异常到底学得怎样 [打印本页]

作者: jojo    时间: 2015-1-9 19:43
标题: 测测你的Java异常到底学得怎样
本帖最后由 jojo 于 2015-1-10 16:30 编辑

据说能够正确分析出下面这道程序的输出就证明你的Java异常完全没有任何问题了。本以为自己学得还可以,结果瞬间被秒杀了,有兴趣的童鞋可以试试。答案我会附在最后面。

  1. public class TestException {
  2. public TestException() {
  3. }

  4. boolean testEx() throws Exception {
  5. boolean ret = true;
  6. try {
  7. ret = testEx1();
  8. } catch (Exception e) {
  9. System.out.println("testEx, catch exception");
  10. ret = false;
  11. throw e;
  12. } finally {
  13. System.out.println("testEx, finally; return value=" + ret);
  14. return ret;
  15. }
  16. }

  17. boolean testEx1() throws Exception {
  18. boolean ret = true;
  19. try {
  20. ret = testEx2();
  21. if (!ret) {
  22. return false;
  23. }
  24. System.out.println("testEx1, at the end of try");
  25. return ret;
  26. } catch (Exception e) {
  27. System.out.println("testEx1, catch exception");
  28. ret = false;
  29. throw e;
  30. } finally {
  31. System.out.println("testEx1, finally; return value=" + ret);
  32. return ret;
  33. }
  34. }

  35. boolean testEx2() throws Exception {
  36. boolean ret = true;
  37. try {
  38. int b = 12;
  39. int c;
  40. for (int i = 2; i >= -2; i--) {
  41. c = b / i;
  42. System.out.println("i=" + i);
  43. }
  44. return true;
  45. } catch (Exception e) {
  46. System.out.println("testEx2, catch exception");
  47. ret = false;
  48. throw e;
  49. } finally {
  50. System.out.println("testEx2, finally; return value=" + ret);
  51. return ret;
  52. }
  53. }

  54. public static void main(String[] args) {
  55. TestException testException1 = new TestException();
  56. try {
  57. testException1.testEx();
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
复制代码


答案:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false


作者: xiaoyi    时间: 2015-1-9 20:13
看不懂,求指导
作者: 李忠兵    时间: 2015-1-9 20:41
我擦,我的第三和第四步搞反了
作者: jojo    时间: 2015-1-10 10:01
李忠兵 发表于 2015-1-9 20:41
我擦,我的第三和第四步搞反了

我的打印输出是多了几个,所以才想知道正解是如何出来的
作者: biweibiren    时间: 2015-1-10 16:07
finally是肯定会被执行到的(不知道什么原理,记住就好)。
finally的块中有return语句,那么catch中的throw或是return 语句不会被执行。有一点要注意的是,如果catch语句中有return x=1这样的语句,那么x会被赋值为1。
相当于在catch中程序到了throw或return之后就不动了,转而去执行finally,然后回过头来执行catch中的throw和return语句。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2