感谢@ 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); }
}
答案 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);
}
答:实际上,这可能会因两个原因而崩溃:
数字可能会变得很大,以至于JVM无法处理它。
该函数可以调用自身很多次,导致JVM崩溃(即Stack Overflow错误)。
后一种情况更合理;即使该方法实际上没有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)〜。