黑马程序员技术交流社区

标题: 考验一下目测的能力,令人惊诧的结果。 [打印本页]

作者: 胡建彪    时间: 2012-10-25 14:47
标题: 考验一下目测的能力,令人惊诧的结果。
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"
令你惊诧的结果,欢迎大神们讨论。


作者: 程杰    时间: 2012-10-25 14:54
会不停的C吧

作者: 胡建彪    时间: 2012-10-25 15:06
程杰 发表于 2012-10-25 14:54
会不停的C吧

是 怎么理解
作者: 李润根    时间: 2012-10-25 15:09
因为finally一定会执行的
作者: 崔政    时间: 2012-10-25 17:11
我感觉是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。
个人感觉是这样的。。
作者: 胡建彪    时间: 2012-10-25 17:31
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连续两次输出,有兴趣的朋友可以说说。
作者: 杨从强    时间: 2012-10-25 22:35
结果是先B后A。
作者: zdf091119    时间: 2012-10-26 10:09
我看结果是c,但这是什么规律,为什么会出现想多线程一样,求个解释
作者: 黑马杨锦喜    时间: 2012-10-26 19:07
     楼主,答案是C,至于输出结果,会因为不同电脑而有不同的输出 ,如果要理解为什么,就需要去理解JVM的原理以及指令的原理了。这点涉及到计算机组成原理以及操作系统方面的知识。
     对于JVM来说,它并不知道哪处是try,哪处是catch,哪处是finally,甚至对于它来说,根本就没有try catch finally的概念,它知道的只有你给我什么指令,我就执行什么指令,没有语法,没有辨别
      任何方法编译后的结果只是一串字节码指令流,各个指令间都是等价的,虽然我们在我们的方法中添加上了try catch finally,但这只是Java语法,编译后的字节码是没有这些东西的,编译的过程是按照Java语法规范生成一系列的包含判断、跳转、返回等指令的指令流,以使JVM在执行这些指令流时并不总是顺序执行

     如果需要,请百度或者google吧




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