Java 这是否会导致堆栈溢出错误?
增加对象的实例变量是否会导致堆栈溢出错误 例如: 此方法(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 (
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]) ;
}
}