Приведет ли это когда-либо к ошибке переполнения стека? - PullRequest
1 голос
/ 15 апреля 2010

Приведет ли когда-нибудь увеличение переменных экземпляра объекта к ошибке переполнения стека?

Например:

Этот метод (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++), чтобы вместо 6 миллионов было что-то достаточно высокое?

Ответы [ 6 ]

9 голосов
/ 15 апреля 2010

переполнение стека? Нет, но это может привести к переполнению целых чисел, что совсем другое.

Переполнение стека означает, что пространство в стеке вызова метода исчерпано (возможно, из-за убегающего рекурсивного вызова). Целочисленное переполнение приведет к тому, что int будет вращаться вокруг своего наименьшего значения, если его значение будет больше максимального значения.

3 голосов
/ 15 апреля 2010

В Java ошибка переполнения стека возникает из-за чрезмерной рекурсии . Здесь функция сама вызывает , прямо или косвенно.

В вашем первом примере функция StackOverflow напрямую вызывает себя без ограничений.

В вашем примере Dice не существует экземпляра, где функция вызывает себя, поэтому вы вряд ли столкнетесь с ошибкой переполнения стека.

2 голосов
/ 15 апреля 2010

Ошибка переполнения стека вызвана бесконечной рекурсией, то есть методом, вызывающим себя слишком много раз. Ваш второй пример кода, похоже, вообще не использует рекурсию, поэтому я не думаю, что возможна ошибка переполнения стека.

0 голосов
/ 15 апреля 2010

Это приведет к переполнению целых чисел, потому что тип int идет от прибл. От -2E7 до 2E7

0 голосов
/ 15 апреля 2010

Приведет ли это когда-либо к ошибке переполнения стека?

  • да

Проще говоря:

Переполнение стекагенерируется при переполнении стека, потому что приложение рекурсивно работает слишком глубоко.Это означает, что ваша строка StackOverflow(x+1) ; может выдать ошибку переполнения стека, зависит от того, насколько велик ваш стек.Кроме того, код начнет получать неожиданные значения типа int.

0 голосов
/ 15 апреля 2010

Ну, вы можете изменить максимальный размер стека в Java с помощью ключа -Xss. Наименьший стек составляет около 1 КБ, поэтому вам не потребуется бесконечная (или даже очень большая) рекурсия для получения желаемого переполнения стека, но вам определенно понадобится больше, чем вы дали в своем примере. Я предполагаю, что моя точка зрения состоит в том, что рекурсия достаточна, но не необходима, чтобы вызвать переполнение стека; со сколь угодно малым стеком вызовов вы можете переполнить его произвольно небольшим количеством вызовов методов.

...