title: StackOverFlowError in Java postfix calculator
body: <p>The following class is used by another program. When it is accessed, it throws a StackOverFlowError. This is part of a Postfix Calculator I have to do as a project at my university. </p>
  
  <p>Any help would be greatly appreciated, thank you in advance. I'm quite new at Java and I have no idea what to do.</p>
  
  <p>CODE: </p>
  
  <pre><code>import java.util.Queue;
  import java.util.Stack;
  
  public class MyPostfixMachine implements PostfixMachineInterface {
  
      MyMathOperations mmo = new MyMathOperations();
      MyPostfixMachine mpm = new MyPostfixMachine();
  
      public String evaluate(Queue q) {
          if (q.isEmpty()) {//if the input is empty, terminate the program
              System.exit(0);
          }
          if (q.size() == 1) {//if there is only one number in the queue, return it as the solution
              if (mpm.isParsableToDouble(String.valueOf(q.remove()))) {
                  return String.valueOf(q.remove());
              }
          }
          Stack&lt;String&gt; finalxp = new Stack&lt;String&gt;();//create an empty stack
          if (mpm.isParsableToDouble(String.valueOf(q.remove()))) {//if first element of queue q is a number,push it into the stack
              finalxp.push(String.valueOf(q.remove()));
          } else {//depending on the operator perform the corresponding operations
              if (q.remove() == "+") {
                  String str = String.valueOf(finalxp.pop());
                  String str2 = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.addition(str, str2));
              }
              if (q.remove() == "-") {
                  String str = String.valueOf(finalxp.pop());
                  String str2 = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.substraction(str, str2));
              }
              if (q.remove() == "*") {
                  String str = String.valueOf(finalxp.pop());
                  String str2 = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.product(str, str2));
              }
              if (q.remove() == "/") {
                  String str = String.valueOf(finalxp.pop());
                  String str2 = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.division(str, str2));
              }
              if (q.remove() == "fibo") {
                  String str = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.fibonacci(str));
              }
              if (q.remove() == "fac") {
                  String str = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.factorial(str));
              }
              if (q.remove() == "han") {
                  String str = String.valueOf(finalxp.pop());
                  finalxp.push(mmo.hanoi(str));
              }
          }
          return String.valueOf(finalxp.pop());
      }
  
      public boolean isParsableToDouble(String candidate) {
          try {
              Double.parseDouble(candidate);
              return true;
          } catch (NumberFormatException nfe) {
              return false;
          }
      }
  }
  
  
  
  
  
  public class MyMathOperations implements MathOperationsInterface {
  
  public String addition(String s1, String s2) {
  
      double A = Double.parseDouble(s1);
      double B = Double.parseDouble(s2);
  
      return String.valueOf((A + B));
  }
  
  public String substraction(String s1, String s2) {
      double A = Double.parseDouble(s1);
      double B = Double.parseDouble(s2);
  
      return String.valueOf((A - B));
  }
  
  public String product(String s1, String s2) {
      double A = Double.parseDouble(s1);
      double B = Double.parseDouble(s2);
  
      return String.valueOf((A * B));
  }
  
  public String division(String s1, String s2) {
      double A = Double.parseDouble(s1);
      double B = Double.parseDouble(s2);
  
      return String.valueOf((A / B));
  }
  
  public String fibonacci(String s) {
      int n = Integer.parseInt(s);
      return String.valueOf(fibo(n));
  }
  
  public int fibo(int f) {
      if (f &lt; 0) {
          throw new IllegalArgumentException("Cannot apply Fibonacci method");
      } else if (f == 0) {
          return 0;
      } else if (f == 1) {
          return 1;
      } else {
          return fibo(f - 1) + fibo(f - 2);
      }
  
  }
  
  public String hanoi(String s) {
      int a = Integer.parseInt(s);
      int han = 0;
      if (a &lt; 0) {
          throw new IllegalArgumentException("Not a valid integer");
      } else {
          han = (int) Math.pow(2, a) - 1;
      }
      return String.valueOf(han);
  }
  
  public String factorial(String s) {
      int a = Integer.parseInt(s);
  
      if (a &lt; 0) {
          throw new IllegalArgumentException("Incorrect argument for factorial operatiion");
      }
      switch (a) {
          case 0:
          case 1:
              return String.valueOf(1);
          default:
  
              int res = a;
              while (true) {
                  if (a == 1) {
                      break;
                  }
  
                  res *= --a;
              }
              return String.valueOf(res);
      }
  
  }
  
  private static double pDouble(String s) {
      double res = 0d;
      try {
          res = Double.parseDouble(s);
      } catch (NumberFormatException e) {
          System.exit(1);
      }
  
      return res;
  }
  </code></pre>
  
  <p>}</p>