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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东城 中级黑马   /  2013-2-6 22:00  /  2582 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东城 于 2013-2-7 01:38 编辑
  1. package com.itheima;

  2. public class TestTryCatch {

  3.         public static void main(String args[]) {
  4.                 System.out.println(test());
  5.         }

  6.         public static int test() {
  7.                 int k = 0;
  8.                 try {
  9.                         k += 2;
  10.                         return k;
  11.                 } catch (Exception e) {
  12.                         k++;
  13.                         return k;
  14.                 } finally {
  15.                         k += 5;
  16.                 }
  17.         }
  18. }
复制代码
大家说这个程序的结果会输出什么?开始我认为输出为7,可是实际输出为2,但是经过调试,在程序返回前是要经过k += 5 这段代码的,并且通过观察点k的值是7,但是真正的输出却是2,这是为什么?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

12 个回复

倒序浏览
package com.itheima;

public class TestTryCatch {

        public static void main(String args[]) {
                System.out.println(test());
        }

        public static int test() {
                int k = 0;
                try {
                        k += 2;
                        return k;
                } catch (Exception e) {
                        k++;
                        return k;//在这里已经返回了值
                } finally {//因为这个无论怎么样都会执行
                        k += 5;//这是返回之后才加的,所以是2时候已经返回,换回之后才加到7
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
try..catch..finally,语句是这样的
try
{
//这里放可能会出现异常的代码;

}
catch(Exception e)
{
//这里放处理异常的代码;只有在try时发生了异常,这里的代码才会被运行;
}
finally
{
//这里存放的是一定会执行的代码,不管try发生了异常没有,他都会运行,所以一般这里放关闭资源等代码;
}


根据,你的代码分析来看:
首先在try中,k的值已经变成2,返回了,这时k的值是2;
但是你下面还有一个finally,这里的代码一定会被执行,那么,k += 5 的值就是 2+5就等于7;

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
finally里的的代码无法修改return的值,其他值还是可以,具体为什么,没有深入研究过,你可以在finally里修改并打印一个没有返回的值就能看到结果是可以被修改的,但是return的值不行
回复 使用道具 举报
try {
                 k += 2;
                  return k;// k的值在这里已经返回了  而且System.out.println(test());这句也正是打印返回的值
       }
catch (Exception e)
              {
                 k++;
                      return k;
               }
   finally {
                     k += 5;//这句话实在返回以后才加上的  而k是方法中的局部变量 方法执行完毕则死亡
            }

如果这么写,则打印的是7
try {
                 k += 2;
       }
catch (Exception e)
              {
                 k++;
                      return k;
               }
   finally {
                     k += 5;
                    return k;
            }

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. public static void main(String[] args) {
  2.                
  3.                 int i = test();
  4.                 System.out.println(i);
  5.         }
  6.        
  7.         public static int test() {
  8.                
  9.                 int i = 123;
  10.                
  11.                 int x = 123;
  12.                
  13.                 try {
  14.                         System.out.println("--------try---------");
  15.                
  16.                         return i;
  17.                        
  18.                 } finally {
  19.                        
  20.                         i += 222;
  21.                        
  22.                         x += 222;
  23.                        
  24.                         System.out.println("---------finally-------x="+x+"-------i="+i);
  25.                 }
  26.                
  27.         }
复制代码
--------try---------
---------finally-------x=345-------i=345
123

其实都被修改了,先执行finally里的代码,但return的那个值,不会变了,finally执行完,才会真正返回这个值

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
path环境变量和classpath环境变量
回复 使用道具 举报
如果我们要使用计算机中的某条命令,首先必须要找到这条命令,我们才可以使用它,否则在命令行中会报找不到此命令的错误,那么在计算机中是怎么找一条命令并执行它呢?
回复 使用道具 举报
我们可以配置path环境变量,这样就可以在任何目录下执行在path变量中配置路径下的命令。配置path环境变量就是给要执行的命令指定路径。
回复 使用道具 举报
classpath环境变量,java中,在jdk1.5后已经不需要配置classpath环境变量了,classpath环境变量是让其加载器自动加载classpath环境变量下的class文件。使在任何目录下都可以执行同一目录下的class文件。
回复 使用道具 举报
但是,classpath环境变量尽量少用,因为,一旦配置了classpath,在我们执行class文件的时候,本来是要到当前目录下执行我们需要执行的文件,但是不小心,当前目录下的class文件被删/或不存在,那么它就会自动的执行classpath环境变量下的class文件,这就造成我们不想看到的结果。在java的JDK1.5后就不需要我们配置classpath环境变量了。这给我们减少了很多麻烦。
回复 使用道具 举报
配置path环境变量的技巧:
我们配置path环境变量的时候,路径会改变,会造成路径改错。我们可以使用用户变量如:JAVA_HOME配置jdk路径,再把JAVA_HOME作内容配置在path环境变量中。
回复 使用道具 举报
我们到别人的计算机上运行或编写一个java程序,别人机器上又没有装有jdk。我们也不需要去装一个jdk,更不需要配置path环境变量,这里我们可以使用set命令临时的配置一个环境变量。
如set path=jdk路径
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马