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的转换。
答案 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));