论坛首页 招聘求职论坛

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

浏览 25005 次
精华帖 (0) :: 良好帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-20   最后修改:2011-07-20
第二题不是没有溢出,其实已经溢出了。
具体递归深度多少取决于jvm的设置或者系统允许的最大递归深度还有内存。
当到达递归临界值的时候(测试了下大概2K多,不同机器内存应该是不一样吧),其实已经溢出了
只是有finally后,会先要保证执行它里面的,而这里又一次递归溢出,所以到临界值后就一直循环下去了。
测试会发现递归深度的临界值也是不断调整的,应该和内存分配有关吧。

具体执行,自己反编译下字节码执行就明白了
0 请登录后投票
   发表时间: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
.........


在我结束它的时候它还没有打印完呢
0 请登录后投票
   发表时间:2011-07-20  
int A=0;
while(true)
A=1;
System.out.println(A);
不可到达代码
0 请登录后投票
   发表时间:2011-07-20  
第二个题只能输出try和finally,不会出catch,因为不会异常。直接栈压满溢出直接出错。。执行过程,先执行try,后把foo()压入栈,继续执行下去,因为没有异常所以直接到finally,后执行finally的foo(),同样到栈,后调用finally的foo().输入finally。调用try的。
0 请登录后投票
   发表时间: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[])"后,这段代码就没有问题了?

求解惑
0 请登录后投票
   发表时间:2011-07-20  
chimer 写道
第二题不是没有溢出,其实已经溢出了。
具体递归深度多少取决于jvm的设置或者系统允许的最大递归深度还有内存。
当到达递归临界值的时候(测试了下大概2K多,不同机器内存应该是不一样吧),其实已经溢出了
只是有finally后,会先要保证执行它里面的,而这里又一次递归溢出,所以到临界值后就一直循环下去了。
测试会发现递归深度的临界值也是不断调整的,应该和内存分配有关吧。

具体执行,自己反编译下字节码执行就明白了

正解,我记得java解惑里有关于这个的解释,应该是个假死循环,可能要执行几亿年才会溢出
0 请登录后投票
   发表时间: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方法,所以不报错
0 请登录后投票
   发表时间:2011-08-04   最后修改:2011-08-04
第三题

final int A;
if(false)
A=1;
System.out.println(A);
0 请登录后投票
   发表时间: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]);
		}
	}

 打印的结果:

49
1
13
1
10
1

终于明白结果为什么是1 1 1,解惑:

执行System.in.read()方法将从键盘缓冲区读入一个字节的数据,然后返回16位的二进制数据,其低8位为键盘的ASCII码,高8位为0。

数字1的ASCII码为49,换行\r的ASCII码为13,回车\n的ASCII码为10,从控制台输入数字1的操作为:输入1然后换行、回车。

 

貌似是这样的话,这题在linux下的运行结果还不一样,linux下换行符就一个字符

0 请登录后投票
   发表时间:2011-08-04  
第二题把System.out.println换成logger.info,避免命令行输出太快而丢失信息后;
实际结果是N多try,然后貌似随机的数个try/finally交替;
原以为是堆栈溢出,然后进入catch块,然后又可以push做方法调用,再然后多干次后又溢出开始pop并且finally,因而比较有规律的try/catch/finally
但是实际上,整个日志里面看不到catch。。。这点最不能接受。。。扼杀了我的猜想
0 请登录后投票
论坛首页 招聘求职版

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