为啥这段代码会抛出 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 没有发生任何转换,这可能导致 ***。

【问题讨论】:

因为你不知道退出递归的条件 堆栈溢出不是由doubleintfloat 或任何其他类型之间的任何转换引起的。堆栈溢出几乎完全是由无限递归引起的。 【参考方案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

为啥进程列表时抛出 java.lang.UnsupportedOperationException [重复]