PostFixCalculator while / try error

import java.util.Scanner; public class PostFixCalculator { public static void main(String [] args) { Scanner kbd = new Scanner(System.in); int result; String expression; System.out.println("Student name, CS-304, Fall 2014, Asst 2c."); System.out.println("To quit this program, just hit 'return'.\n"); System.out.print("Enter a postfix expression: "); expression = kbd.nextLine(); while (!expression.equals("")) { try { } catch(RuntimeException e) { } System.out.print("\nEnter a postfix expression: "); expression = kbd.nextLine(); } // end while (!expression.equals("")) System.out.println("\nBye!"); } // end public static void main(String [] args) public static int postFixEvaluate(String input) { Scanner tokenizer; int result, operand1, operand2, value; String operator; LinkedStack s = new LinkedStack(); tokenizer = new Scanner(input); while (tokenizer.hasNext()) { if (tokenizer.hasNextInt()) { value = tokenizer.nextInt(); s.push(value); } else // we have an operator { operator = tokenizer.next(); if (s.isEmpty()) throw new RuntimeException ("Not Enough Operands"); operand2 = s.pop(); if (s.isEmpty()) throw new RuntimeException ("Not Enough Operands"); operand1 = s.pop(); if (operator.equals("+")) result = operand1 + operand2; else if (operator.equals("-")) result = operand1 - operand2; else if (operator.equals("*")) result = operand1 * operand2; else if (operator.equals("/")) result = operand1 / operand2; else throw new RuntimeException ("Not Enough Operands"); s.push(result); } // end else // we have an operator } // end while (tokenizer.hasNext()) if (s.isEmpty()) throw new RuntimeException ("Not Enough Operands"); result = s.pop(); if (!s.isEmpty()) throw new RuntimeException ("Not Enough Operands"); return result; } // end public static int postFixEvaluate(String input) } // end public class PostFixCalculator 

I have this code, PostFixCalculator, but everything that I inserted at this time and trying, I got an error all the time. The program compiles and starts as it is placed, but it does not work correctly. I hit the wall.

+5
source share
3 answers

Just try making e.printStackTrace () in the catch block and you will see that this is a NullPointerException error. If you make an empty catch block, you will lose all this information.

try the following:

 package test; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class PostFixCalculator { public static void main(String[] args) { Scanner kbd = new Scanner(System.in); String expression; System.out.println("Student name, CS-304, Fall 2014, Asst 2c."); System.out.println("To quit this program, just hit 'return'.\n"); System.out.print("Enter a postfix expression: "); expression = kbd.nextLine(); while (!expression.equals("")) { try { System.out.println(postFixEvaluate(expression)); } catch (RuntimeException e) { System.out.println(e.getLocalizedMessage()); } System.out.print("\nEnter a postfix expression: "); expression = kbd.nextLine(); } // end while (!expression.equals("")) System.out.println("\nBye!"); kbd.close(); } public static String postFixEvaluate(String input) { List<String> operatorsAsStrings = getListOfValuesAsString(input.split("\\d+")); List<String> digitsAsStrings = getListOfValuesAsString(input.split("\\W+")); if(operatorsAsStrings.size() >= digitsAsStrings.size()){ throw new RuntimeException("Incorrect format of expression."); } if(digitsAsStrings.size()<2){ throw new RuntimeException("Not Enough Operands."); } BigInteger result = new BigInteger("0"); boolean firstTime = true; for (int i=0; i<=digitsAsStrings.size()-1; i++) { if(firstTime){ result = result.add(new BigInteger(digitsAsStrings.get(i))); firstTime = false; }else{ String operator = operatorsAsStrings.get(i-1); if (operator.equals("+")) result = result.add(new BigInteger(digitsAsStrings.get(i))); else if (operator.equals("-")) result = result.subtract(new BigInteger(digitsAsStrings.get(i))); else if (operator.equals("*")) result = result.multiply(new BigInteger(digitsAsStrings.get(i))); else if (operator.equals("/")) result = result.divide(new BigInteger(digitsAsStrings.get(i))); } } return result.toString(); } private static List<String> getListOfValuesAsString(String[] split) { List<String> resultList = new ArrayList<>(); for(String string: split){ if(string != null && !string.isEmpty()){ resultList.add(string); } } return resultList; } } 
+3
source

Your while loop is incrct. Try revising it and making corrections

+5
source

I will work better if you call postFixEvaluate :-)

Try

 while (!expression.equals("")) { System.out.println(postFixEvaluate(expression)); 

(Another alternative, if the call is simply missed in the question, is something wrong with LinkedStack - I used Stack instead)

+1
source

Source: https://habr.com/ru/post/1202711/


All Articles