在这段代码中,我有一个重写的toString()方法。我在名为AddExpression的ArithBinaryExpression类的子类中调用此toString()方法。 它抛出了一个异常,它返回到toString()方法。我想解决这个stackoverflow错误。任何帮助表示赞赏!
Response:
{
"errorMessage": "2018-06-11T02:34:19.817Z ef864d3d-6d1f-11e8-b6e3-97ac89a0f544 Task timed out after 3.00 seconds"
}
Request ID:
"ef864d3d-6d1f-11e8-b6e3-97ac89a0f544"
Function Logs:
START RequestId: ef864d3d-6d1f-11e8-b6e3-97ac89a0f544 Version: $LATEST
dadf1a33-6d22-11e8-869d-7d7e31ccaf6e the data from db : rk
END
Exception in thread "main" java.lang.StackOverflowError
at main$AddExpression.toString(main.java:20)
public class ArithValue implements ArithExpression {
private double doubValue;
ArithValue(double dVal) {
this.doubValue = dVal;
}
public double result() {
return doubValue;
}
@Override
public String toString() {
return String.valueOf(doubValue);
}
}
public static class AddExpression extends ArithBinaryExpression {
public AddExpression(ArithExpression leftExp, ArithExpression rightExp) {
super(leftExp, rightExp);
}
public double result() {
double rightExp = getRightExpression().result();
double leftExp = getLeftExpression().result();
return rightExp + leftExp;
}
public String toString() {
return "Expression: " + "(" + leftExpression.toString() + " + " + rightExpression.toString() + ")";
}
}
这是ArithExpression界面:
public abstract class ArithBinaryExpression implements ArithExpression {
protected static ArithExpression leftExpression;
protected static ArithExpression rightExpression;
// constructor
public ArithBinaryExpression(ArithExpression left, ArithExpression right) {
if (left == null) {
leftExpression = new ArithValue(0);
}
else
leftExpression = left;
if (right == null) {
rightExpression = new ArithValue(0);
}
else
rightExpression = right;
}
// end constructor
// accessors
public ArithExpression getLeftExpression() {
return leftExpression;
}
public ArithExpression getRightExpression() {
return rightExpression;
}
}
答案 0 :(得分:1)
猜想:由于你正在使用leftExpression和rightExpression的静态变量,你的bug就会显现出来。
粘贴主要方法可以让我们确定猜想是否属实,但似乎是你不想要的东西
答案 1 :(得分:0)
由于leftExpression
或rightExpression
可以是AddExpression
的实例,因此您可能具有循环依赖关系,例如:
AddExpression e1 = new AddExpression(null, null);
AddExpression e2 = new AddExpression(e2, null);
e1.leftExpression = e2;
或
AddExpression e1 = new AddExpression(null, null);
e1.leftExpression = e1;
此示例将导致无限回调并导致给定的溢出异常。
尝试向toString()
的{{1}}方法添加支票实例:
AddExpression
检查本身并不是一个真正的解决方案,它更像是一个检查,以确保循环依赖导致问题。通常情况下,计算器(我猜你正在尝试编码)不可能创建循环依赖项。相反,这会导致语法错误。
但是我可以理解,可能很难阻止用户定义任何非法表达式,因此您可能希望计算递归深度,例如通过静态变量来计算,以防止至少堆栈溢出。