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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-25 14:47  /  3186 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Try {
    private static void foo() {
        try {
        System.out.println("try");
        foo();
        } catch (Throwable e) {
        System.out.println("catch");
        foo();
        } finally {
        System.out.println("finally");
        foo();
        }
    }
    public static void main(String[] args) {
          foo();
    }
}
A.执行一段时间后报栈溢出。 B.会一直输出“try”。 C.会一直输出“try”和“finally”。 D.会一直输出“try”、"catch"
令你惊诧的结果,欢迎大神们讨论。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

8 个回复

正序浏览
     楼主,答案是C,至于输出结果,会因为不同电脑而有不同的输出 ,如果要理解为什么,就需要去理解JVM的原理以及指令的原理了。这点涉及到计算机组成原理以及操作系统方面的知识。
     对于JVM来说,它并不知道哪处是try,哪处是catch,哪处是finally,甚至对于它来说,根本就没有try catch finally的概念,它知道的只有你给我什么指令,我就执行什么指令,没有语法,没有辨别
      任何方法编译后的结果只是一串字节码指令流,各个指令间都是等价的,虽然我们在我们的方法中添加上了try catch finally,但这只是Java语法,编译后的字节码是没有这些东西的,编译的过程是按照Java语法规范生成一系列的包含判断、跳转、返回等指令的指令流,以使JVM在执行这些指令流时并不总是顺序执行

     如果需要,请百度或者google吧
回复 使用道具 举报
我看结果是c,但这是什么规律,为什么会出现想多线程一样,求个解释
回复 使用道具 举报
结果是先B后A。
回复 使用道具 举报
cz2861856 发表于 2012-10-25 17:11
我感觉是c。
try和finally不停的输出。
而且不是try finally try finally try finally

try 的输出是一点 规律都没有,但是每当输出finally时,貌似都是连续的两个输出:
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
try
try
try
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
try
try
tryfinallyfinally
tryfinallyfinally
try
tryfinallyfinally
tryfinallyfinally
try
try
tryfinallyfinally
tryfinallyfinally
其实这只一个java的选择的面试题,至于为什么这样finally连续两次输出,有兴趣的朋友可以说说。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
我感觉是c。
try和finally不停的输出。
而且不是try finally try finally try finally
而是,try finally try try  finally try try try finally 。。。不规则。
我感觉有点多线程的意思。(但肯定不是多线程)
  1. private static void foo() {
  2.         try {
  3.         System.out.println("try");
  4.         foo();
  5.         } catch (Throwable e) {
  6.         System.out.println("catch");
  7.         foo();
  8.         } finally {
  9.         System.out.println("finally");
  10.         foo();
  11.         }
  12.     }
复制代码
在执行try的时候,输出语句,然后foo(),但是finally一定会执行,所以打出finally,他也调用foo。
但不一定谁更快一些,所以不规则的输出try 和finally。
个人感觉是这样的。。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
因为finally一定会执行的
回复 使用道具 举报
程杰 发表于 2012-10-25 14:54
会不停的C吧

是 怎么理解
回复 使用道具 举报
会不停的C吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马