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

时间:2010-04-14 21:41:18

标签: java recursion stack-overflow

是否会增加对象的实例变量会导致堆栈溢出错误?

例如:

此方法(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 = (b-a) ;
        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万这样的东西呢?

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

堆栈溢出错误是由无限递归引起的,也就是说,一个自己调用太多次的方法。您的第二个代码示例似乎根本不使用递归,因此我认为不存在堆栈溢出错误。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  

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

简单地说:

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

答案 5 :(得分:-1)

这会导致整数溢出,因为int类型来自约。 -2E7至2E7