Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是否会导致堆栈溢出错误?_Java_Recursion_Stack Overflow - Fatal编程技术网

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

Java 这是否会导致堆栈溢出错误?,java,recursion,stack-overflow,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 (

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

例如:

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

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

    public static void main (String[]arg) { StackOverflow (0) ; 
} 
但是这会吗?:(……是我为了缩短代码而加入的一个缺口。它已经足够长了。)

publicstaticvoidmain(字符串[]arg)
{
骰子a1=新骰子(“a1”);

对于(inti=0;i堆栈溢出?否,但它可能导致整数溢出,这是一个非常不同的事情


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

堆栈溢出?否,但它可能会导致整数溢出,这是一种非常不同的情况


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

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

在您的第一个示例中,
StackOverflow
函数直接调用自身而不绑定


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

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

在您的第一个示例中,
StackOverflow
函数直接调用自身而不绑定


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

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

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

好的,您可以使用-Xss开关更改java中堆栈的最大大小。最小的堆栈是大约1KB,因此您不需要无限(甚至非常多)递归可以获得所需的堆栈溢出,但您肯定需要比您在示例中给出的更多。我想我的观点是,递归足以导致堆栈溢出,但不是必需的;对于任意小的调用堆栈,您可以使用任意小的方法调用使其溢出。

嗯,您可以更改最大值java中带-Xss开关的堆栈的最小大小。最小的堆栈大约为1KB,因此不需要无限大(甚至非常大)递归可以获得所需的堆栈溢出,但您肯定需要比您在示例中给出的更多。我想我的观点是,递归足以导致堆栈溢出,但不是必需的;对于任意小的调用堆栈,您可以使用任意小的方法调用使其溢出

这会导致堆栈吗 溢出错误

简言之:

当由于应用程序递归太深而发生堆栈溢出时,会引发堆栈溢出。 这意味着您的行
StackOverflow(x+1);
可能引发堆栈溢出错误,这取决于堆栈的大小。除此之外,代码将开始获得意外的int值

这会导致堆栈吗 溢出错误

简言之:

当由于应用程序递归太深而发生堆栈溢出时,会引发堆栈溢出。
这意味着您的行
StackOverflow(x+1);
可能引发堆栈溢出错误取决于堆栈的大小。除此之外,代码将开始获得意外的int值。

这将导致整数溢出,因为int类型从大约-2E7到2E7

这将导致整数溢出,因为int类型从大约-2E7到2E7

在特定条件下函数不再调用自身的递归。递归是完全可以的,但递归太深则不行。没有递归停止的条件。函数不再调用自身的特定条件。递归是完全可以的,但递归太深则不行。如果没有g递归停止的条件。
public类StackOverflow{public static void main(String…args){main(null);}}
现在,这是一个
StackOverflowError
;)这个问题的重点是什么?简单地说:当由于应用程序递归太深而发生堆栈溢出时,会引发堆栈溢出。我打赌如果您更改了“堆栈最小大小”通过传递一个JVM选项,您可以让掷骰子的人处理更多的迭代。@ring Bearner:虽然大多数情况下StackOverflow是由深度递归引起的,但这肯定不是唯一的原因:如果您有数千个不同的方法堆叠在一起,它也可能导致StackOverflow。为什么不自己试试看呢?
公共类StackOverflow{public static void main(String…args){main(null);}}
现在,这是一个
StackOverflowerError
;)这个问题的重点是什么?简单地说:当堆栈溢出发生时,堆栈溢出会被抛出,因为应用程序递归太深。我打赌如果您更改了“堆栈最小大小”通过传递一个JVM选项,您可以让掷骰子的人处理更多的迭代。@ring Bearner:虽然大多数时间StackOverflow是由深度递归引起的,但它肯定不是唯一的原因:如果您有数千个不同的方法堆叠在一起
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]) ; 
    } 

}