簡體   English   中英

這會導致堆棧溢出錯誤嗎?

[英]Will this ever result in a stack overflow error?

增加對象的實例變量是否會導致堆棧溢出錯誤?

例如:

此方法(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萬的足夠高的東西?

堆棧溢出? 不,但是可能導致整數溢出,這是完全不同的事情。

堆棧溢出意味着方法調用堆棧上的空間已用盡(可能是由於遞歸調用失控)。 如果整數溢出超過其最大值,則整數將導致int繞到其最小值。

在Java中,堆棧溢出錯誤來自過度的遞歸 這是函數直接或間接調用自身的地方。

在您的第一個示例中, StackOverflow函數直接無限制地調用自身。

在您的Dice示例中,沒有函數調用其自身的實例,因此您不太可能遇到堆棧溢出錯誤。

堆棧溢出錯誤是由無限遞歸引起的,即無限次遞歸。 您的第二個代碼示例似乎根本沒有使用遞歸,因此我認為不可能發生堆棧溢出錯誤。

好了,您可以使用-Xss開關更改java中堆棧的最大大小。 最小的堆棧約為1KB,因此您不需要無限(甚至非常多)的遞歸來獲得所需的堆棧溢出,但是您肯定需要比示例中給出的更多的內容。 我想我的觀點是,遞歸足以引起堆棧溢出,但不是必須的。 使用任意小的調用堆棧,您可以使用任意數量的方法調用將其溢出。

這會導致堆棧溢出錯誤嗎?

簡單的說:

由於應用程序的遞歸太深而導致堆棧溢出時,將引發堆棧溢出。 那意味着你的行StackOverflow(x+1) ; 可能引發堆棧溢出錯誤取決於堆棧的大小。 除此之外,代碼還將開始獲取意外的int值。

這將導致您出現Integer溢出,因為int類型從大約。 -2E7至2E7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM