为什么这段代码会抛出java.lang.StackOverflowError

时间:2013-06-01 02:30:26

标签: java

private static double convertCentimeterToInches(double d) {
    double feetPart = 0;
    double inchesPart = 0;
    if (String.valueOf(d) != null && !String.valueOf(d).trim().isEmpty()) {
        feetPart = Math.floor(convertCentimeterToInches(d) / 12);
        inchesPart = Math.ceil(convertCentimeterToInches(d) - (feetPart * 12));
    }
    return inchesPart;
}

06 - 01 02: 25: 08.037: E / XXX(1099): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java: 352) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.util.concurrent.FutureTask.setException(FutureTask.java: 219) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.util.concurrent.FutureTask.run(FutureTask.java: 239) 
06 - 01 02: 25: 08.037: E / XXX(1099): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java: 230)
06 - 01 02: 25: 08.037: E / XXX(1099): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1080) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 573) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.Thread.run(Thread.java: 856) 
06 - 01 02: 25: 08.037: E / XXX(1099): Caused by: java.lang.StackOverflowError 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.RealToString.longDigitGenerator(RealToString.java: 269) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.RealToString.convertDouble(RealToString.java: 111) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.RealToString.doubleToString(RealToString.java: 59) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.Double.toString(Double.java: 317) 
06 - 01 02: 25: 08.037: E / XXX(1099): at java.lang.String.valueOf(String.java: 1625)

我正在考虑为什么它抛出stackoverflow错误,当一切看起来都是完美的双倍。 double to int or float没有发生可能导致stackoverflow的转换。

4 个答案:

答案 0 :(得分:4)

你有一个无限循环,你继续打电话:

convertCentimeterToInches(d)

没有用于结束递归的子句。我有一段时间没有这样做,但从厘米到英寸的正确转换将是:

d / 2.54

正如前一个帖子What is a stack overflow error?中的答案之一所说:

  

堆栈溢出的常见原因是错误的递归调用。

答案 1 :(得分:3)

StackOverflow与从double到int或float的转换无关。当有一个没有基本条件的递归调用时会发生这种情况。函数一次又一次地调用自身,stack frames继续构建,直到堆栈上没有空间为止,从而导致StackOverflow。

确保您的递归函数具有基本情况。

答案 2 :(得分:2)

if (String.valueOf(d) != null && !String.valueOf(d).trim().isEmpty())

将始终为true,因此该方法将继续调用自身,直到它达到堆栈溢出错误...

你需要找到一个会在某个时刻打破递归的条件。

如果您真的想将厘米转换为英寸,它应该看起来像:

private static double convertCentimeterToInches(double d) {
    return d / 2.54;
}

答案 3 :(得分:1)

你有无限的递归。要解决......

替换此

    feetPart = Math.floor(convertCentimeterToInches(d) / 12);
    inchesPart = Math.ceil(convertCentimeterToInches(d) - (feetPart * 12));

用这个

    feetPart = Math.floor(d / 12);
    inchesPart = Math.ceil(d - (feetPart * 12));