为啥这段代码会抛出 java.lang.***Error [重复]
Posted
技术标签:
【中文标题】为啥这段代码会抛出 java.lang.***Error [重复]【英文标题】:why does this code throw java.lang.***Error [duplicate]为什么这段代码会抛出 java.lang.***Error [重复] 【发布时间】:2013-05-27 22:30:29 【问题描述】: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.***Error
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)
我只是在想为什么它会抛出 *** 错误,而一切似乎都完美无缺。 double to int or float
没有发生任何转换,这可能导致 ***。
【问题讨论】:
因为你不知道退出递归的条件 堆栈溢出不是由double
、int
、float
或任何其他类型之间的任何转换引起的。堆栈溢出几乎完全是由无限递归引起的。
【参考方案1】:
if (String.valueOf(d) != null && !String.valueOf(d).trim().isEmpty())
将始终为真,因此该方法将不断调用自身,直到遇到堆栈溢出错误...
你需要找到一个在某个时刻会中断递归的条件。
如果你真的想把厘米换算成英寸,它可能应该是这样的:
private static double convertCentimeterToInches(double d)
return d / 2.54;
【讨论】:
【参考方案2】:你有一个无限循环,你继续调用:
convertCentimeterToInches(d)
没有结束递归的子句。我有一段时间没有这样做了,但是从厘米到英寸的正确转换是:
d / 2.54
正如上一个帖子What is a stack overflow error? 中的一个答案所说:
堆栈溢出的常见原因是错误的递归调用。
【讨论】:
【参考方案3】:*** 与从 double 到 int 或 float 的转换无关。当有一个没有基本条件的递归调用时会发生这种情况。一个函数不断调用自己,stack frames 不断累积,直到堆栈上没有更多空间,从而导致 ***。
确保您的递归函数具有基本情况。
【讨论】:
【参考方案4】:你有无限递归。修复...
替换这个
feetPart = Math.floor(convertCentimeterToInches(d) / 12);
inchesPart = Math.ceil(convertCentimeterToInches(d) - (feetPart * 12));
有了这个
feetPart = Math.floor(d / 12);
inchesPart = Math.ceil(d - (feetPart * 12));
【讨论】:
以上是关于为啥这段代码会抛出 java.lang.***Error [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥这段代码会抛出 ReferenceError: test is not defined?
为啥 npm start 会抛出 events.js:187 throw er; // 我的反应项目中未处理的“错误”事件?
为啥这个不安全的代码会抛出 NullReferenceException?
在 Maven 中使用 FindSecBugs 会抛出 java.lang.OutOfMemoryError
Eclipse:使用 Coverage 进行测试会抛出 java.lang.instrument.IllegalClassFormatException