黑马程序员技术交流社区

标题: 关于try-catch和return的问题 [打印本页]

作者: 王晓斌    时间: 2013-1-4 10:44
标题: 关于try-catch和return的问题
本帖最后由 hi_wxb 于 2013-1-4 22:11 编辑

代码如下,为什么只在try中写return语句,编译器报错?
  1. public String doSth_2(){
  2.         try {
  3.            str="改变前的字符串,说明finally不能改变返回值";
  4.            System.out.println("try语句执行!!");
  5.            return str;
  6.             
  7.         } catch (Exception e) {
  8.             // TODO: handle exception
  9.         }
  10.         finally{
  11.             
  12.             str="改变后的字符串,说明finally可以改变返回值";
  13.             System.out.println("finally语句执行");
  14.             
  15.         }
  16.       
  17.     }
复制代码

作者: 冉世友    时间: 2013-1-4 10:53
你的str没有声明类型,而且代码块中声明的变量只在代码块内有效啊
一般这样写的:
  1. package it.cast.cn.demo;

  2. public class Snippet {
  3.         public String doSth_2(){
  4.               String str = null;
  5.                 try {
  6.                    str="改变前的字符串,说明finally不能改变返回值";
  7.                    System.out.println("try语句执行!!");
  8.                   
  9.                     
  10.                 } catch (Exception e) {
  11.                     // TODO: handle exception
  12.                 }
  13.                 finally{
  14.                     
  15.                     str="改变后的字符串,说明finally可以改变返回值";
  16.                     System.out.println("finally语句执行");
  17.                     
  18.                 }
  19.                return str;
  20.               
  21.             }
  22. }
复制代码

作者: 王晓斌    时间: 2013-1-4 11:01
冉世友 发表于 2013-1-4 10:53
你的str没有声明类型,而且代码块中声明的变量只在代码块内有效啊
一般这样写的:
...

String声明肯定有了,我这里是只截取了一个方法,毕竟这个问题有好多情况呢、、、但只针对这一种情况我就是想知道为什么把return语句只放try里边,报错呢?
作者: 冉世友    时间: 2013-1-4 11:06
hi_wxb 发表于 2013-1-4 11:01
String声明肯定有了,我这里是只截取了一个方法,毕竟这个问题有好多情况呢、、、但只针对这一种情况我就 ...

把return语句只放try里边返不回去啊
作者: 刘文超    时间: 2013-1-4 11:25
本帖最后由 刘文超 于 2013-1-4 11:34 编辑

我想是这样的、假如try中代码还没执行到return就有异常了、
那么就会跳到catch中,然后finally,然后方法结束、
但是这个方法是有返回值类型为String的、是不可以不return的、
当然lz可能说:它不会有异常产生的、一定会return、
但编译器只要看到try、catch就会假设有异常怎么办、它考虑各种情况、
所以要在最后写一个return才行
这个和if-else一个道理,看下述代码和你问题一样的哦:
  1. public int test(){
  2.                 if("abc".length()>0){
  3.                         return 1;
  4.                 }else{
  5.                         //return 0;
  6.                 }
  7.                 //return 0;
  8.         }
复制代码
显然它一定会执行if,然后返回1、但是编译器就会考虑,一旦没有执行if里面、就返回 不了了、、
所以,必须在if和else里面同时写或者外边写一句return。才ok的
作者: 王晓斌    时间: 2013-1-4 22:10
刘文超 发表于 2013-1-4 11:25
我想是这样的、假如try中代码还没执行到return就有异常了、
那么就会跳到catch中,然后finally,然后方法结 ...

有道理,没想到这点,谢谢!!




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