黑马程序员技术交流社区

标题: try块中出现return语句的问题 [打印本页]

作者: 王红潮    时间: 2012-9-12 18:00
标题: try块中出现return语句的问题
本帖最后由 王红潮 于 2012-9-12 19:14 编辑

  1. <P> </P>
复制代码
  1. public class Demo {

  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. System.out.println(new Demo().test());
  7. System.out.println(new Demo().test2());
  8. System.out.println(new Demo().test3());
  9. System.out.println(new Demo().test4());
  10. }
  11. int test(){
  12. int x=1;
  13. try{
  14. return x;
  15. }
  16. finally{
  17. ++x;
  18. }
  19. }

  20. boolean test2(){
  21. boolean flag = false;
  22. try{
  23. return !flag;
  24. }finally{
  25. return flag;
  26. }
  27. }

  28. int test3(){
  29. int x =1;
  30. try{
  31. //System.out.println("x=" +x);
  32. return x;
  33. }finally{
  34. return ++x;
  35. }
  36. }

  37. int test4(){
  38. try{
  39. return func1();
  40. }finally{
  41. return func2();
  42. }
  43. }
  44. int func1() {
  45. System.out.println("func1");
  46. return 1;
  47. }
  48. int func2() {
  49. System.out.println("func2");
  50. return 2;
  51. }

  52. }
复制代码
运行结果:
1
false
2
func1
func2
2

为什么try语句块中的return语句没有意义了?依然没有想明白,为什么Eclipse 编译器提示黄色叹号 ,提示finally块并不完全正常,提供的解决方法是移除try..catch块



作者: 赵云柯    时间: 2012-9-12 18:44
因为你的代码中,try和finally语句块中都有return语句。

当执行到try中的return语句时,程序会在返回前先跳到finally语句块中执行,但是finally中也有return语句,代码执行到这里就直接返回了。

因此try中的return语句永远都执行不到,编译器会发出警告。
作者: Tesla时光    时间: 2012-9-12 18:49
这个题目的关健点在于:try里的return执行完后的结果会临时储存一下,然后去执行完finally,
finally执行完后,如果没有return,那么会再把前面try时的return的值返回去,
注意:如果finally有return,则直接返回return的值,这个语句就结束了!不会再返回之前return里的值!
那个警告是表示你try了,但是没有catch,这个不影响程序运行.
public class Demo {
public static void main(String[] args) {
  System.out.println(new Demo().test());
  System.out.println(new Demo().test2());
  System.out.println(new Demo().test3());
  System.out.println(new Demo().test4());
}
int test() {
  int x = 1;
  try {
   return x;
  }
  finally {
   ++x;---这个不用说,没有return,虽然x成了2,但没有返回去.结果是 1
  }
}
boolean test2() {
  boolean flag = false;
  try {
   return !flag;----这里先return了一个true,但没有返回,执行完finally后,有return,所以结果是false
  } finally {
   return flag;
  }
}
int test3() {
  int x = 1;
  try {
   return x;----这里先return了一个1,但没有返回,执行完finally后,有return ++x,所以结果是2

  } finally {
   return ++x;
  }
}
int test4() {
  try {
   return func1();--这里先执行func1,打印"func1"后了一个1,但没有返回,只是临时存存,执行完finally里的func2后打印一个"func2",有return 2,所以结果是func1 func2 2
  } finally {
   return func2();
  }
}
int func1() {
  System.out.println("func1");
  return 1;
}
int func2() {
  System.out.println("func2");
  return 2;
}
}

作者: 王红潮    时间: 2012-9-12 19:13
翁发达 发表于 2012-9-12 18:49
这个题目的关健点在于:try里的return执行完后的结果会临时储存一下,然后去执行完finally,
finally执行完后, ...

明白了,谢谢




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