从抽象类的子类调用toString()方法,它会抛出stackoverflower错误

时间:2018-06-11 02:59:28

标签: java

在这段代码中,我有一个重写的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;
}

}

2 个答案:

答案 0 :(得分:1)

猜想:由于你正在使用leftExpression和rightExpression的静态变量,你的bug就会显现出来。

粘贴主要方法可以让我们确定猜想是否属实,但似乎是你不想要的东西

答案 1 :(得分:0)

由于leftExpressionrightExpression可以是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

检查本身并不是一个真正的解决方案,它更像是一个检查,以确保循环依赖导致问题。通常情况下,计算器(我猜你正在尝试编码)不可能创建循环依赖项。相反,这会导致语法错误。

但是我可以理解,可能很难阻止用户定义任何非法表达式,因此您可能希望计算递归深度,例如通过静态变量来计算,以防止至少堆栈溢出。