有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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这一事实有关,也许我只是没有正确调用函数。如果是这样的话,调用这个函数的正确方法是什么,这样它也可以打印出我需要的信息?或者这个错误与我对它的理解完全不同


共 (4) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    当你调用这个foo(5, 1);时,参数是51这意味着foo{}内部的逻辑失败,因此else侧的代码将执行,也就是说return foo(5/1,1) + 1;这将反复调用foo,并重复。。。导致StackOverflowError

    foo(5, 1);总是在没有结束的情况下呼叫foo,所以你得到了StackOverflowError 试着结束这个电话

  3. # 3 楼答案

    如果问题是错误的返回类型,则会出现编译错误。当方法耗尽所有已分配的内存时,会导致stackoverflow错误。有关如何导致堆栈溢出错误的更多信息,请阅读以下内容:What is a StackOverflowError?

  4. # 4 楼答案

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

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