java在静态方法中调用非静态方法
我的代码有点问题。我试图找到运行时,与我为这个问题准备的一些数学进行比较。我有一种特别的测试方法,是这样的:
public static int foo(int n, int k){
long startTime = System.nanoTime();
if(n<=k){
long endTime = System.nanoTime();
System.out.println("checkFoo");
System.out.println("start time: " +startTime);
System.out.println("end time: " +endTime);
return 1;
}
else{
return foo(n/k,k) + 1;
}
}
我以以下方式在我的主要方法中测试这段代码:
public static void main(String[] args){
foo(1, 1);
foo(5, 1);
foo(10, 1);
foo(100, 1);
}
我在上面写着一个错误
Exception in thread "main" java.lang.StackOverflowError
然后它重复这句话:
at Problem3.foo(Problem3.java:42)
我想知道这是否与foo应该返回int这一事实有关,也许我只是没有正确调用函数。如果是这样的话,调用这个函数的正确方法是什么,这样它也可以打印出我需要的信息?或者这个错误与我对它的理解完全不同
# 1 楼答案
看起来您有一个无限重复的函数调用,这会导致JVM的堆溢出。尝试包括一些输入验证,以防止出现这种情况
# 2 楼答案
当你调用这个}内部的逻辑失败,因此
foo(5, 1);
时,参数是5
和1
这意味着foo
{else
侧的代码将执行,也就是说return foo(5/1,1) + 1;
这将反复调用foo
,并重复。。。导致StackOverflowError
foo(5, 1);
总是在没有结束的情况下呼叫foo
,所以你得到了StackOverflowError
试着结束这个电话# 3 楼答案
如果问题是错误的返回类型,则会出现编译错误。当方法耗尽所有已分配的内存时,会导致stackoverflow错误。有关如何导致堆栈溢出错误的更多信息,请阅读以下内容:What is a StackOverflowError?
# 4 楼答案
您的代码在无限循环中运行,但您可以像下面这样捕获它