繁体   English   中英

Java - StackOverFlow错误

[英]Java - StackOverFlow error

所以多亏了@ fireshadow52,我已经成功地想出了这个sin的脚本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); }
}

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

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

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

类似问题的答案中摘录......

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

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

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

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

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

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

return Math.sin(x);

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

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

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

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

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

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

  2. 该函数可以调用自身很多次以至于JVM崩溃(即堆栈溢出错误)。

后一种情况更合理; 即使该方法实际上没有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时,发生终止条件。


PS如果你感到沮丧, 这是一个真正的 StackOverFlow错误!

你的代码很接近,但sin函数应该是真的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM