这是否会导致堆栈溢出错误?

递增对象的实例变量会导致堆栈溢出错误吗?

例如:

此方法(java)将导致堆栈溢出错误:

class StackOverflow { public static void StackOverflow (int x) { System.out.println (x) ; StackOverflow(x+1) ; } public static void main (String[]arg) { StackOverflow (0) ; } 

但这会是吗?:( …..是我为缩短代码而设置的差距。它的长度足够长。)

 import java.util.*; class Dice { String name ; int x ; int[] sum ; 

….

 public Dice (String name) { this.name = name ; this.x = 0 ; this.sum = new int[7] ; } 

….

 public static void main (String[] arg) { Dice a1 = new Dice ("a1") ; for (int i = 0; i<6000000; i++) { a1.roll () ; printDice(a1) ; } } 

….

  public void roll () { this.x = randNum(1, this.sum.length) ; this.sum[x] ++ ; } public static int randNum (int a, int b) { Random random = new Random() ; int c = (ba) ; int randomNumber = ((random.nextInt(c)) + a) ; return randomNumber ; } public static void printDice (Dice Dice) { System.out.println (Dice.name) ; System.out.println ("value: "+Dice.x) ; printValues (Dice) ; } public static void printValues (Dice Dice) { for (int i = 0; i<Dice.sum.length; i++) System.out.println ("#of "+i+"'s: "+Dice.sum[i]) ; } } 

以上当前不会导致堆栈溢出错误,但是如果我在main中更改了这一行,我也可以得到它: for (int i = 0; i<6000000; i++)这样,那里有600万的东西,而不是那么高的东西?

堆栈溢出? 不,但它可能导致整数溢出,这是一个非常不同的事情。

堆栈溢出意味着方法调用堆栈上的空间已耗尽(可能是因为失控的递归调用)。 如果增量超出其最大值,整数溢出将导致int循环到其最低值。

在Java中,堆栈溢出错误来自过度递归 。 这是函数直接或间接调用自身的地方。

在第一个示例中, StackOverflow函数直接调用自身而不受约束。

在Dice示例中,没有函数调用自身的实例,因此您不太可能遇到堆栈溢出错误。

堆栈溢出错误是由无限递归引起的,也就是说,一个方法调用自身的次数太多了。 你的第二个代码示例似乎根本没有使用递归,所以我认为堆栈溢出错误是不可能的。

这是否会导致堆栈溢出错误?

简单的说:

发生堆栈溢出时会抛出堆栈溢出,因为应用程序过于冗长。 这意味着你的行StackOverflow(x+1) ; 可以抛出堆栈溢出错误取决于堆栈的大小。 除此之外,代码将开始获得意外的int值。

那么,您可以使用-Xss开关更改java中堆栈的最大大小。 最小的堆栈大约是1KB,所以你不需要无限(甚至非常多)递归来获得所需的堆栈溢出,但你肯定需要的不仅仅是你在你的例子中给出的。 我想我的观点是递归是足够的,但不是必要的,导致堆栈溢出; 使用任意小的调用堆栈,您可以使用任意少量的方法调用来溢出它。

这将导致您进入Integer溢出,因为int类型来自约。 -2E7至2E7