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

时间:2018-09-15 20:17:55

标签: java exception runtime static-methods

我的代码有一个小问题。我试图找到运行时以与我为该问题准备的一些数学进行比较。我有一种正在测试的方法尤其如此:

 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;
        }
    }

我通过以下方法在我的main方法中测试此代码:

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的事实有关,也许我只是没有正确调用该函数。在这种情况下,什么是调用此函数的正确方法,以便它还能打印出我需要的信息?还是这个错误与我所理解的完全不同?

5 个答案:

答案 0 :(得分:3)

您只有一个无限的递归循环:

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

答案 1 :(得分:1)

调用此foo(5, 1);时,参数为51,这意味着foo if(5<=1)内部的逻辑失败,因此在{{1 }}将执行,即else,这将一次又一次地调用return foo(5/1,1) + 1;,然后重复并重复...导致foo

StackOverflowError总是以结尾foo(5, 1);结尾的电话,因此您得到foo 尝试结束通话

答案 2 :(得分:1)

如果问题是错误的返回类型,则将出现编译错误。当该方法用完已分配的所有内存时,将导致堆栈溢出错误。有关如何引起堆栈溢出错误的更多信息,请阅读:What is a StackOverflowError?

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您的代码正在无限循环中运行,但是您可以像下面这样捕获它

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 (StackOverflowError e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return 1;
            }
        }
    }