在静态方法中调用非静态方法

Calling non static method in static method

我的代码有点问题。我试图找到运行时来与我为该问题准备的一些数学进行比较。我有一个特别的方法,我正在测试它是这样的:

 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.WhosebugError

然后它重复了这行:

at Problem3.foo(Problem3.java:42) 

我想知道这是否与 foo 应该 return 一个 int 的事实有关,也许我只是没有正确调用该函数。如果是这样,调用此函数的正确方法是什么,以便它也打印出我需要的信息?还是这个错误与我理解的完全不同?

你只有一个无限递归循环:

foo(5, 1): n = 5, k = 1
calls foo(5 / 1, 1), i.e. foo(5, 1)
calls foo(5 / 1, 1), i.e. foo(5, 1)
calls foo(5 / 1, 1), i.e. foo(5, 1)
...

当你调用这个 foo(5, 1); 时,参数是 51 这意味着 foo if(5<=1) 中的逻辑失败,因此 if(5<=1) 中的代码 else 将执行,即 return foo(5/1,1) + 1; 这将一次又一次地调用 foo,然后重复,然后重复...导致 WhosebugError

foo(5, 1); 总是以 foo 结束调用,所以你得到 WhosebugError 尝试结束此通话

如果问题是错误的 return 类型,您将得到一个编译错误。当该方法用完所有已分配的内存时,会导致计算器溢出错误。有关如何导致 Whosebug 错误的更多信息,请阅读:What is a WhosebugError?

您似乎有一个无限循环函数调用,这导致了 JVM 的堆溢出。尝试包括一些输入验证以防止出现这种情况。

您的代码 运行 处于无限循环中,但您可以像下面那样捕捉它

public static int foo(int n, int k){
        long startTime = System.nanoTime();
        if(n<=k){`enter code here`
            long endTime = System.nanoTime();
            System.out.println("checkFoo");
            System.out.println("start time: " +startTime);
            System.out.println("end time: " +endTime);
            return 1;
        }
        else{
            try {
                return foo(n/k,k) + 1;
            } catch (WhosebugError e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return 1;
            }
        }
    }