锁定老帖子 主题:遇到这3道笔试题,大家有把握能做对几道
精华帖 (16) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-19
做错两道题。前两道题讲解一下吧。谢谢!~
|
|
返回顶楼 | |
发表时间:2011-07-19
最后修改:2011-07-19
第三题,
return A=1; System.out.println(A); |
|
返回顶楼 | |
发表时间:2011-07-20
kilery_019 写道 第2题觉得D,因为我觉得foo在try块里不停的递归执行,而导致第一层递归没有办法返回,换句话说,
System.out.println("try"); foo(); System.out.println("else");// 永远执行不到 最终会outOfMemery,会被第一层的catch(Throwable),注意,这里是Throwable,所以Error也不放过。 所以程序终究要打印catch的。 但是上机后我发现这个有点诡异,大家可以试试 直接运行代码,结果是C(证明以上分析有点问题,但是我没找到问题所在,悲剧),但是!但是! 如果大家把debug放到第3行,然后按住F8别松手,结果却是B 如果有高手的话,求解释。 确实像你说的一样,等待解释.... |
|
返回顶楼 | |
发表时间:2011-07-20
Reset 写道
簡單從泚銷夨 写道
fangshengcai001 写道
悲剧了 写道
第二题应该是C吧
你是对的..... +1 开始我认为选B 测试了下原来是C。 B+2 C+1 ...
B+3 C+1 ... :D [/quote] |
|
返回顶楼 | |
发表时间:2011-07-20
第二题不明白:
测试结果是先输出“try”,在输出3050(根据环境不同输出个数不同)个后肯定会跑出栈溢出的异常。主要迷惑在以下几点: 1、现成中使用了休眠需要截取异常,所以会输出catch,如果不截异常不会输出。 ........ try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051finally3048 try3048 ? try3049 ? try3050 ? try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051catch3050 try3050 try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051finally3050 try3050 try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051catch3049 try3049 ? try3050 try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051catch3050 try3050 try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051finally3050 try3050 try3051catch3051finally3051catch3051 try3051catch3051finally3051finally3051 try3051catch3051finally3051finally3049 try3049 ? try3050 为什么会输出3048和3049的信息? 2、为什么Throwable(Error)有异常程序不中止? |
|
返回顶楼 | |
发表时间:2011-07-20
谜题45:令人疲惫不堪的测验
本谜题将测试你对递归的了解程度。下面的程序将做些什么呢? public class Workout { public static void main(String[] args) { workHard(); System.out.println("It's nap time."); } private static void workHard() { try { workHard(); } finally { workHard(); } } } 要不是有try-finally 语句,该程序的行为将非常明显:workHard 方法递归地 调用它自身,直到程序抛出StackOverflowError,在此刻它以这个未捕获的异 常而终止。但是,try-finally 语句把事情搞得复杂了。当它试图抛出 StackOverflowError 时,程序将会在finally 语句块的workHard 方法中终止, 这样,它就递归调用了自己。这看起来确实就像是一个无限循环的秘方,但是这 个程序真的会无限循环下去吗?如果你运行它,它似乎确实是这么做的,但是要 想确认的唯一方式就是分析它的行为。 iTePub.Net-Collect Java 虚拟机对栈的深度限制到了某个预设的水平。当超过这个水平时,VM 就抛 出StackOverflowError。为了让我们能够更方便地考虑程序的行为,我们假设 栈的深度为3,这比它实际的深度要小得多。现在让我们来跟踪其执行过程。 main 方法调用workHard,而它又从其try 语句块中递归地调用了自己,然后它 再一次从其try 语句块中调用了自己。在此时,栈的深度是3。当workHard 方 法试图从其try 语句块中再次调用自己时,该调用立即就会以 StackOverflowError 而失败。这个错误是在最内部的finally 语句块中被捕获 的,在此处栈的深度已经达到了3。在那里,workHard 方法试图递归地调用它自 己,但是该调用却以StackOverflowError 而失败。这个错误将在上一级的 finally 语句块中被捕获,在此处站的深度是2。该finally 中的调用将与相对 应的try 语句块具有相同的行为:最终都会产生一个StackOverflowError。这 似乎形成了一种模式,而事实也确实如此。 WorkOut 的运行过程如左面的图所示。在这张图中,对workHard 的调用用 箭头表示,workHard 的执行用圆圈表示。所有的调用除了一个之外,都是递归 的。会立即产生StackOverflowError 异常的调用用由灰色圆圈前导的箭头表示, try 语句块中的调用用向左边的向下箭头表示,finally 语句块中的调用用向右 边的向下箭头表示。箭头上的数字描述了调用的顺序。 这张图展示了一个深度为0 的调用(即main 中的调用),两个深度为1 的调用, 四个深度为2 的调用,和八个深度为3 的调用,总共是15 个调用。那八个深度 为3 的调用每一个都会立即产生StackOverflowError。至少在把栈的深度限制 为3 的VM 上,该程序不会是一个无限循环:它在15 个调用和8 个异常之后就会 终止。但是对于真实的VM 又会怎样呢?它仍然不会是一个无限循环。其调用图 与前面的图相似,只不过要大得多得多而已。 那么,究竟大到什么程度呢?有一个快速的试验表明许多VM 都将栈的深度限制 为1024,因此,调用的数量就是1+2+4+8…+21,024=21,025-1,而抛出的异常的 数量是21,024。假设我们的机器可以在每秒钟内执行1010 个调用,并产生1010 个异常,按照当前的标准,这个假设的数量已经相当高了。在这样的假设条件下, 程序将在大约1.7×10291 年后终止。为了让你对这个时间有直观的概念,我告 诉你,我们的太阳的生命周期大约是1010 年,所以我们可以很确定,我们中没 有任何人能够看到这个程序终止的时刻。尽管它不是一个无限循环,但是它也就 算是一个无限循环吧。 从技术角度讲,调用图是一棵完全二叉树,它的深度就是VM 的栈深度的上限。 WorkOut 程序的执行过程等于是在先序遍历这棵树。在先序遍历中,程序先访问 一个节点,然后递归地访问它的左子树和右子树。对于树中的每一条边,都会产 生一个调用,而对于树中的每一个节点,都会抛出一个异常。 本谜题没有很多关于教训方面的东西。它证明了指数算法对于除了最小输入之外 的所有情况都是不可行的,它还表明了你甚至可以不费什么劲就可以编写出一个 指数算法。 |
|
返回顶楼 | |
发表时间:2011-07-20
第一题太有迷惑性了,没仔细想都没看明白!!!
|
|
返回顶楼 | |
发表时间:2011-07-20
fangshengcai001 写道 第一题是 1,1,1 后等待输入 测出来的 System.in.read().会把回车和换行也看成一种输入...OUT了 测了好几次才发现
然后再随便输入一个数字,系统会再次输出1,1,1。然后console就停止了! 求解~~~ |
|
返回顶楼 | |
发表时间:2011-07-20
dxxghx 写道 fangshengcai001 写道 第一题是 1,1,1 后等待输入 测出来的 System.in.read().会把回车和换行也看成一种输入...OUT了 测了好几次才发现
然后再随便输入一个数字,系统会再次输出1,1,1。然后console就停止了! 求解~~~ 其实System.in.read()只是为了控制一个循环,当输入1+回车(/r/n),相当于三次System.in.read(),因此会输出前三个值,当输入随便一个数字**+回车(/r/n),也相当于三次System.in.read(),会输出数组的后三个值。understand? |
|
返回顶楼 | |
发表时间:2011-07-21
第二題運行多長時間才能出堆棧異常,已運行8分鐘,java進程使用內存13MB,
跟內存有關嗎? |
|
返回顶楼 | |