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

I am just thinking on why its throwing stackoverflow error, when everything seems to be perfect in double. There is no conversion happening from double to int or float which could result in stackoverflow.

4

4 回答 4

4

你有一个无限循环,你继续调用:

convertCentimeterToInches(d)

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

d / 2.54

作为上一个线程中的答案之一什么是堆栈溢出错误?说:

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

于 2013-06-01T02:34:02.853 回答
3

StackOverflow 与从 double 到 int 或 float 的转换无关。当有一个没有基本条件的递归调用时会发生这种情况。一个函数不断地一次又一次地调用自己,并且堆栈帧不断建立,直到堆栈上没有更多空间为止,从而导致 StackOverflow。

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

于 2013-06-01T02:34:16.967 回答
2
if (String.valueOf(d) != null && !String.valueOf(d).trim().isEmpty())

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

您需要找到一个在某些时候会破坏递归的条件。

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

private static double convertCentimeterToInches(double d) {
    return d / 2.54;
}
于 2013-06-01T02:34:02.710 回答
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));
于 2013-06-01T02:36:02.160 回答