我想知道当您试图捕获StackOverflowError时会发生什么,并提出了以下方法:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
现在我的问题是:
为什么这个方法打印'4'?
我想可能是因为system.out.println()
在调用堆栈上需要3个段,但我不知道3这个数字来自哪里。当您查看system.out.println()
的源代码(和字节码)时,通常会导致比3个多得多的方法调用(因此调用堆栈中的3个段是不够的)。如果这是因为Hotspot VM应用的优化(方法内联),我想知道在另一个VM上结果是否会有所不同。
编辑:
由于输出似乎高度特定于JVM,我使用
Java(TM)SE运行时环境(构建1.6.0_41-B02)
Java HotSpot(TM)64位服务器VM(构建20.14-B01,混合模式)得到结果4
解释为什么我认为这个问题不同于理解Java堆栈:
我的问题不是为什么会有一个cnt>0(显然是因为system.out.println()
需要堆栈大小,并在打印某些内容之前抛出另一个StackOverflowError
),而是为什么在其他系统上有4的特定值,分别是0、3、8、55或其他值。
我认为其他人在解释为什么cnt>0方面做得很好,但关于为什么cnt=4以及为什么cnt在不同设置中变化如此之大还没有足够的细节。我将试图填补这里的空白。
让
system.out.println所需的堆栈空间
示例1:假设
那么C=楼层((X-M)/r)=49,cnt=天花板((p-(x-m-c*r))/r)=0。
然后C=20,cnt=3。
示例4:假设
编辑
我终于抽出时间做了一些实验来支持我的理论。不幸的是,理论似乎与实验不符。实际发生的事情是非常不同的。
实验设置:Ubuntu 12.04服务器,缺省java和缺省-JDK。Xss从70,000开始,以1字节递增到460,000。
结果可以在以下站点获得:https://www.google.com/fusiontables/datasource?docid=1xkjhd4s8bilghe6gzbcfus3vt5mps_onscjwdbm。换句话说,只显示与前面不同的点。这样更容易看到异常。https://www.google.com/fusiontables/datasource?docid=1xg_srzrrnasepwzonhqeakuzlhiam9vbedwfsua
问题内容: 我想知道当您尝试捕获StackOverflowError并提出以下方法时会发生什么: 现在我的问题是: 为什么此方法打印“ 4”? 我以为是因为在调用堆栈上需要3个段,但是我不知道3的来源。当您查看的源代码(和字节码)时,通常导致的方法调用要多于3(因此,调用堆栈上的3个段是不够的)。如果是由于优化而应用了Hotspot VM(方法内联),我想知道其他VM上的结果是否会有所不同。 编辑
问题内容: 我有以下代码行: 我希望看到的结果是0.555,但是它将打印出零。有人可以帮我理解为什么会这样吗?我目前正在学习编程,并感谢您的帮助。 谢谢! 问题答案: 发生这种情况是因为您在不知不觉中正在执行Integer Division。为了使计算更快,计算机在不涉及十进制数的情况下使用整数除法,因此会丢失十进制值。 试试看: 要么 要么 要么 要么
我已经把一些代码放在一起,对人们的考试成绩进行排序,这样他们就可以看到他们的最高成绩是什么,以及他们什么时候达到的。我创建了以下代码,但它没有显示1、2、3等计数器,我缺少什么? 它打印以下内容,所有内容都显示1,而它应该是1、2、3等。
我试图制作一个基本的C程序来读取一个文件,但由于某种原因,当我使用运行它时<代码>/Test1 Test1。txt我得到“错误:'s'可能在未初始化的情况下用于此函数”。
问题内容: 我生成了x的两个矩阵: 第一矩阵:和。 第二矩阵:和。 使用以下代码,第一个矩阵花费了8.52秒完成: 使用此代码,第二个矩阵花费了259.152秒来完成: 运行时间显着不同的原因是什么? 正如评论所说,仅打印需要秒,而给。 正如其他指出它对他们正常工作的人一样,例如,我尝试了Ideone.com,这两段代码以相同的速度执行。 测试条件: 我从 Netbeans 7.2 运行了此测试,
所以我有这个代码,叫我白痴哈哈,但是我不能让它打印7。 代码: 我需要知道如何改变与函数中的参数同名的变量。 任何帮助都将不胜感激,如果你不明白这个问题,我很乐意解释更多。