锁定老帖子 主题:遇到这3道笔试题,大家有把握能做对几道
精华帖 (0) :: 良好帖 (10) :: 隐藏帖 (0)
|
||
---|---|---|
作者 | 正文 | |
发表时间:2011-07-20
最后修改:2011-07-20
第二题不是没有溢出,其实已经溢出了。
具体递归深度多少取决于jvm的设置或者系统允许的最大递归深度还有内存。 当到达递归临界值的时候(测试了下大概2K多,不同机器内存应该是不一样吧),其实已经溢出了 只是有finally后,会先要保证执行它里面的,而这里又一次递归溢出,所以到临界值后就一直循环下去了。 测试会发现递归深度的临界值也是不断调整的,应该和内存分配有关吧。 具体执行,自己反编译下字节码执行就明白了 |
||
返回顶楼 | ||
发表时间:2011-07-20
hardPass 写道 dev.eye 写道 hardPass 写道 dev.eye 写道 第二题没有一个答案是正确的
出题人没有问机器就凭空想. 不是一直try, 无限递归会溢出(java.lang.StackOverflowError),但是溢出又给捕获了,溢出信息没有打印 , 所以溢出不抱错,也不会使程序中止,一个无限递归直到你要它停 但是为什么没有打印出catch? 有时会打印catch, 有时不会, 更加说明这道题目的无聊, 做题目要定好前提, 是哪个Jvm的实现, jdk的版本, 1.2, 1.3, 1.4, 1.5, 1.6还是1.7, 调试状态下, 运行状态下都有可能不同. 调试状态下是哪个工具, 命令行, ide(eclipse, netbeans, ....), 每个工具在调试中肯定都有自己的附加处理, 你又不知道人是怎么处理的 , 操作系统,(windows (xp, 7, server 2003, server 2008) ,linux(各种内核), salaris, aix ...), 当前的内存情况, 少内存溢出快, ..... 为什么final都打出了了,但还是没有出现catch? make_miracles 写道 第二题 trycatchfinallycatch trycatchfinallyfinally trycatchfinallycatch try try trycatchfinallycatch trycatchfinallyfinally trycatchfinallycatch try trycatchfinallycatch trycatchfinallyfinally trycatchfinallyfinally try trycatchfinallycatch trycatchfinallyfinally trycatchfinallyfinally try try trycatchfinallycatch ......... 在我结束它的时候它还没有打印完呢 |
||
返回顶楼 | ||
发表时间:2011-07-20
int A=0;
while(true) A=1; System.out.println(A); 不可到达代码 |
||
返回顶楼 | ||
发表时间:2011-07-20
第二个题只能输出try和finally,不会出catch,因为不会异常。直接栈压满溢出直接出错。。执行过程,先执行try,后把foo()压入栈,继续执行下去,因为没有异常所以直接到finally,后执行finally的foo(),同样到栈,后调用finally的foo().输入finally。调用try的。
|
||
返回顶楼 | ||
发表时间:2011-07-20
IcyFenix 写道 挺有趣。我给一个真的变量可写不可读的解法。
public class Test { static { A = 2; System.out.println(A); // 这句编译器会提示“非法向前引用” } static int A = 1; } 这里我有个问题,为什么把"static" 改成 "public static void main(String args[])"后,这段代码就没有问题了? 求解惑 |
||
返回顶楼 | ||
发表时间:2011-07-20
chimer 写道 第二题不是没有溢出,其实已经溢出了。
具体递归深度多少取决于jvm的设置或者系统允许的最大递归深度还有内存。 当到达递归临界值的时候(测试了下大概2K多,不同机器内存应该是不一样吧),其实已经溢出了 只是有finally后,会先要保证执行它里面的,而这里又一次递归溢出,所以到临界值后就一直循环下去了。 测试会发现递归深度的临界值也是不断调整的,应该和内存分配有关吧。 具体执行,自己反编译下字节码执行就明白了 正解,我记得java解惑里有关于这个的解释,应该是个假死循环,可能要执行几亿年才会溢出 |
||
返回顶楼 | ||
发表时间:2011-07-21
wildgrowl 写道 IcyFenix 写道 挺有趣。我给一个真的变量可写不可读的解法。
public class Test { static { A = 2; System.out.println(A); // 这句编译器会提示“非法向前引用” } static int A = 1; } 这里我有个问题,为什么把"static" 改成 "public static void main(String args[])"后,这段代码就没有问题了? 求解惑 看下类成员变量的加载顺序就行了 static按顺序加载,所以是先读A=2然后再初始化A=1的,所以报错。 main是方法,不会初始化,所以先int A=1;在执行main方法,所以不报错 |
||
返回顶楼 | ||
发表时间:2011-08-04
最后修改:2011-08-04
第三题
final int A; if(false) A=1; System.out.println(A); |
||
返回顶楼 | ||
发表时间:2011-08-04
javaOak 写道
运行了下第一题对结果感到很迷惑,于是把System.in.read()的结果也打印出来: public static void main(String[] args) throws Exception {
int[] x = new int[6];
Arrays.fill(x, 1);
for (int i = 0; i < x.length; i++) {
System.out.println(System.in.read());
System.out.println(x[i]);
}
}
打印的结果:
终于明白结果为什么是1 1 1,解惑: 执行System.in.read()方法将从键盘缓冲区读入一个字节的数据,然后返回16位的二进制数据,其低8位为键盘的ASCII码,高8位为0。 数字1的ASCII码为49,换行\r的ASCII码为13,回车\n的ASCII码为10,从控制台输入数字1的操作为:输入1然后换行、回车。
貌似是这样的话,这题在linux下的运行结果还不一样,linux下换行符就一个字符 |
||
返回顶楼 | ||
发表时间:2011-08-04
第二题把System.out.println换成logger.info,避免命令行输出太快而丢失信息后;
实际结果是N多try,然后貌似随机的数个try/finally交替; 原以为是堆栈溢出,然后进入catch块,然后又可以push做方法调用,再然后多干次后又溢出开始pop并且finally,因而比较有规律的try/catch/finally 但是实际上,整个日志里面看不到catch。。。这点最不能接受。。。扼杀了我的猜想 |
||
返回顶楼 | ||