Java - StackOverFlow错误

时间:2011-08-21 01:47:07

标签: java stack-overflow

感谢@ fireshadow52,我设法提出sin s args[0]这个脚本。但是,它会吐出StackOverFlow error。这是什么,以及如何(如果可能的话)你会发现它们?

class SIN {
    public static void main(String[] args) {
        double result = sin(args[0]);
    }
    public double sin(x) { Math.sin(x); return sin(x); }
}

4 个答案:

答案 0 :(得分:3)

我不确定它为什么会出现stackoverflow错误,但这不是有效的java。

sin方法不声明输入参数的类型。字符串args需要转换为double才能使Math.sin工作。类名破坏了java编码约定(不是错误)。错误应该由java编译器检测到。编译器是否抛出任何错误?

答案 1 :(得分:2)

你的sin方法正在调用自己,所以这将继续无限期,直到你达到调用堆栈限制,你得到你的异常。你为什么不直接返回Math.sin()?

答案 2 :(得分:2)

摘自an answer to a similar question ......

  

参数和局部变量在堆栈上分配(对象存在于堆上的引用类型和引用该对象的变量)。堆栈通常位于地址空间的上端,当它用完时,它会朝向地址空间的底部(即朝向零)。

     

您的流程还有一个堆,它位于流程的底端。在分配内存时,此堆可以向地址空间的上端增长。正如你所看到的,堆有可能与堆栈“碰撞”(有点像技术板块!!!)。

堆栈溢出错误意味着堆栈(您的方法)溢出(自身执行了很多次以至于崩溃)。堆栈溢出错误通常是由错误的递归调用引起的。

通常,如果您的方法名称中没有关键字void,请确保return值与方法名称不同。否则,堆栈将溢出,导致程序崩溃。只需替换这些行:

Math.sin(x);
return sin(x);

......用这条线......

return Math.sin(x);

......你应该好好去!

有时在查找程序何时崩溃时可能会有点棘手:

问:这个程序会崩溃吗?如果是这样,为什么?

public void MultiplyByNintyNine(byte num) {
    MultiplyByNintyNine(num * 99);
}

答:实际上,这可能会因两个原因而崩溃:

  1. 数字可能会变得很大,以至于JVM无法处理它。

  2. 该函数可以调用自身很多次,导致JVM崩溃(即Stack Overflow错误)。

  3. 后一种情况更合理;即使该方法实际上没有return任何东西,仍然会调用该方法。

    在某些情况下,return方法名称完全可以。但是,如果你这样做,请确保你有终止条件!这是一个类似于你的例子(不会崩溃):

    import java.io.*;
    //class declaration here
    
    public static void main(String[] args) {
        System.out.println(guessTheNumber());
    }
    
    public String guessTheNumber() {
        int guess;
        System.out.print("Guess the number:_");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            guess = Integer.parseInt(br.readLine());
        } catch (NumberFormatException e) {
            System.err.println("You didn't guess a number.");
            guessTheNumber();
        } catch (IOException e) {
            System.err.println("An unexpected error occured. Please try again.");
            guessTheNumber();
        }
        if (guess == 4) {
            return "YAY! You get a prize!";
        } else {
            System.err.println("WAAHH! You get to guess again!");
            guessTheNumber();
        }
    }
    

    警告:停止此代码(来自代码本身)的唯一方法是输入4

    在上述情况下,当用户输入实际数字且该数字为4时,就会出现终止条件。


    P.S。如果你感到沮丧,here is a REAL StackOverFlow error!

答案 3 :(得分:2)

您的代码已关闭,但sin函数应该是

public double sin(double x) {
    return Math.sin(x);
}

请注意,我们只需返回Math.sin(x)的值即可。之后不需要返回`sin(x)〜。