论坛首页 Java企业应用论坛

遇到这3道笔试题,大家有把握能做对几道

浏览 33662 次
精华帖 (16) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
作者 正文
   发表时间:2011-07-19  
做错两道题。前两道题讲解一下吧。谢谢!~
0 请登录后投票
   发表时间:2011-07-19   最后修改:2011-07-19
第三题,
return A=1;
System.out.println(A);
0 请登录后投票
   发表时间: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

如果有高手的话,求解释。


确实像你说的一样,等待解释....
1 请登录后投票
   发表时间:2011-07-20  
Reset 写道
簡單從泚銷夨 写道
fangshengcai001 写道
悲剧了 写道
第二题应该是C吧

你是对的.....

+1
开始我认为选B   测试了下原来是C。


B+2 C+1 ...

 

B+3 C+1 ... :D [/quote]

0 请登录后投票
   发表时间: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)有异常程序不中止?
0 请登录后投票
   发表时间: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 程序的执行过程等于是在先序遍历这棵树。在先序遍历中,程序先访问
一个节点,然后递归地访问它的左子树和右子树。对于树中的每一条边,都会产
生一个调用,而对于树中的每一个节点,都会抛出一个异常。
本谜题没有很多关于教训方面的东西。它证明了指数算法对于除了最小输入之外
的所有情况都是不可行的,它还表明了你甚至可以不费什么劲就可以编写出一个
指数算法。
0 请登录后投票
   发表时间:2011-07-20  
第一题太有迷惑性了,没仔细想都没看明白!!!
0 请登录后投票
   发表时间:2011-07-20  
fangshengcai001 写道
第一题是 1,1,1 后等待输入  测出来的    System.in.read().会把回车和换行也看成一种输入...OUT了  测了好几次才发现

然后再随便输入一个数字,系统会再次输出1,1,1。然后console就停止了!
求解~~~
0 请登录后投票
   发表时间: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?
0 请登录后投票
   发表时间:2011-07-21  
第二題運行多長時間才能出堆棧異常,已運行8分鐘,java進程使用內存13MB,
跟內存有關嗎?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics