2010-04-14 4 views
1

L'incrémentation des variables d'instance d'un objet entraînera-t-elle une erreur de débordement de pile?Cela entraînera-t-il une erreur de débordement de pile?

Par exemple:

Cette méthode (java) provoquera une erreur de débordement de pile:

class StackOverflow { 
    public static void StackOverflow (int x) 
    { 
     System.out.println (x) ; 
     StackOverflow(x+1) ; 
    } 

    public static void main (String[]arg) { StackOverflow (0) ; 
} 

mais ce sera ?: (..... est une lacune que j'ai mis pour raccourcir le code. son assez longtemps qu'il est.)

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]) ; 
    } 

} 

Le ci-dessus ne provoque pas actuellement une erreur de débordement de la pile, mais que je pourrais l'obtenir aussi si je l'ai changé cette ligne principale: for (int i = 0; i<6000000; i++) de sorte qu'au lieu de 6 millions de quelque chose de suffisamment élevé était là?

+0

'public class StackOverflow {public static void principal (String ... args) {main (null); }} 'Maintenant, * cela * est un' StackOverflowError';) – BalusC

+0

Quel est le point de cette question? Tout simplement: Un débordement de pile est déclenché lorsqu'un dépassement de pile se produit car une application récursive trop profondément. –

+0

Je parie que si vous avez changé la "taille minimale de pile" en passant une option JVM que vous pourriez obtenir ce rouleau de dés pour gérer plus d'itérations. – djangofan

Répondre

9

Dépassement de pile? Non, mais cela pourrait mener à un débordement d'entier, ce qui est très différent. Un dépassement de pile signifie que l'espace sur la pile d'invocation de méthode est épuisé (peut-être à cause d'un appel récursif d'emballement). Un débordement d'entier provoquera l'inversion de l'entier à sa valeur la plus basse s'il est incrémenté au-delà de sa valeur maximale.

+0

Qu'est-ce qu'un débordement d'entier? – David

+1

C'est lorsque la valeur d'un entier devient trop grande pour que le type soit maintenu. Pour un 'int' (un entier signé de 32 bits), c'est environ deux milliards. –

+5

J'ai une nouvelle idée pour un nom de site Web. –

3

En Java, une erreur de débordement de pile provient de recursion excessive. C'est là qu'une fonction appelle elle-même, directement ou indirectement.

Dans votre premier exemple, la fonction StackOverflow s'appelle directement sans limite.

Dans votre exemple de Dice, il n'y a pas d'instance où une fonction s'appelle elle-même, donc vous ne risquez pas de rencontrer une erreur de débordement de pile.

+0

ce qui est signifié par lié? – David

+0

Une certaine condition sous laquelle la fonction ne s'appelle plus. La récursivité est parfaitement OK, mais le récursif de trop de niveaux n'est pas le cas. –

+0

Sans qu'il y ait une condition sur laquelle la récursion s'arrête. –

2

Une erreur de dépassement de pile est provoquée par une récursion infinie, c'est-à-dire une méthode qui s'appelle elle-même trop de fois. Votre deuxième exemple de code ne semble pas du tout utiliser la récursivité, donc je ne pense pas qu'une erreur de débordement de pile est possible.

0

Eh bien, vous pouvez changer la taille maximale d'une pile dans Java avec le commutateur -Xss. La plus petite pile fait environ 1 Ko, donc vous n'avez pas besoin d'une récursion infinie (ou même beaucoup) pour obtenir le débordement de pile désiré, mais vous aurez certainement besoin de plus que ce que vous avez donné dans votre exemple. Je suppose que mon point est que la récursivité est suffisante, mais pas nécessaire, pour provoquer un débordement de pile; avec une pile d'appels arbitrairement petite, vous pouvez la surcharger avec un nombre arbitrairement petit d'appels de méthode.

0

Will this ever result in a stack overflow error?

  • oui

mis simplement:

débordement de la pile est jeté quand un débordement de pile se produit car une application récursif trop profondément. Cela signifie que votre ligne StackOverflow(x+1) ; peut lancer une erreur de dépassement de pile dépend de la taille de votre pile. En dehors de cela, le code commencera à obtenir des valeurs int inattendues.

-1

Cela vous mènera au dépassement de nombre entier car les types int vont d'env. -2E7 à 2E7

+0

Non vrai, int peut contenir des valeurs comprises entre -2^31 = -2 147 483 648 et 2^31 - 1 = 2 147 483 647 (inclus). –

Questions connexes