Reputation: 83
So I am making a program that evaluates a postfix expression from a file. However I keep getting the error:
0
Exception in thread "main" java.lang.NumberFormatException: For input string: "+"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:484)
at java.lang.Integer.valueOf(Integer.java:582)
at postfixEvaluater.postfixEvaluation(postfixEvaluater.java:89)
at postfixEvaluater.readFromTheFile(postfixEvaluater.java:49)
at postfixEvaluater.main(postfixEvaluater.java:21)
So I am guessing that it has something to do with my operators based on this.
the contents of the input .txt file are as follows:
511+93/2-932/-149657%/*-+14+96*5/7%-149-+6*57%/
and the expected output is:
5
2
1
8
-4
2
-4
Here is all my code so far:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class postfixEvaluater {
public static void main(String[] commandlineArguments) {
//Error Checking
if(commandlineArguments.length == 0){
System.out.println("Please enter the file name.");
}
else{
postfixEvaluater.readFromTheFile(commandlineArguments[0]);
}
}
public static void readFromTheFile(String fileName) {
//connect to file
File file = new File(fileName);
Scanner scanFile = null;
try {
scanFile = new Scanner(file);
}
catch (FileNotFoundException exception) {
System.out.print("File not found for " + fileName);
System.exit(1);
}
while (scanFile.hasNextLine()) {
String line = scanFile.nextLine();
Integer postfixLine = postfixEvaluater.postfixEvaluation(line);
System.out.println(postfixLine);
}
}
public static Integer postfixEvaluation(String input){
StackInterface<Integer> stack = new LinkedStack<Integer>();
Integer result = new Integer(0);
for(int i=0;i<input.length();i++){
String characterNum = input.substring(i, i+1);
Integer integer1 = new Integer(0);
Integer integer2 = new Integer(0);
Integer character = (Integer.valueOf(characterNum));
if (character.equals("0")) {
stack.push(character);
}
else if (character.equals("1")) {
stack.push(character);
}
else if (character.equals("2")) {
stack.push(character);
}
else if (character.equals("3")) {
stack.push(character);
}
else if (character.equals("4")) {
stack.push(character);
}
else if (character.equals("5")) {
stack.push(character);
}
else if (character.equals("6")) {
stack.push(character);
}
else if (character.equals("7")) {
stack.push(character);
}
else if (character.equals("8")) {
stack.push(character);
}
else if (character.equals("9")) {
stack.push(character);
}
else if (character.equals("*")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 * integer2;
stack.push(result);
}
else if (character.equals("/")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 / integer2;
stack.push(result);
}
else if (character.equals("%")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 % integer2;
stack.push(result);
}
else if (character.equals("+")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 + integer2;
stack.push(result);
}
else if (character.equals("-")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 - integer2;
stack.push(result);
}
}
return result;
}
}
Here is the part of my code where I feel the problem resides(btw I am pushing and popping nothing but integers):
public static Integer postfixEvaluation(String input){
StackInterface<Integer> stack = new LinkedStack<Integer>();
Integer result = new Integer(0);
for(int i=0;i<input.length();i++){
String characterNum = input.substring(i, i+1);
Integer integer1 = new Integer(0);
Integer integer2 = new Integer(0);
Integer character = (Integer.valueOf(characterNum));
if (character.equals("0")) {
stack.push(character);
}
else if (character.equals("1")) {
stack.push(character);
}
else if (character.equals("2")) {
stack.push(character);
}
else if (character.equals("3")) {
stack.push(character);
}
else if (character.equals("4")) {
stack.push(character);
}
else if (character.equals("5")) {
stack.push(character);
}
else if (character.equals("6")) {
stack.push(character);
}
else if (character.equals("7")) {
stack.push(character);
}
else if (character.equals("8")) {
stack.push(character);
}
else if (character.equals("9")) {
stack.push(character);
}
else if (character.equals("*")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 * integer2;
stack.push(result);
}
else if (character.equals("/")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 / integer2;
stack.push(result);
}
else if (character.equals("%")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 % integer2;
stack.push(result);
}
else if (character.equals("+")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 + integer2;
stack.push(result);
}
else if (character.equals("-")) {
integer2 = stack.pop();
integer1 = stack.pop();
result = integer1 - integer2;
stack.push(result);
}
}
return result;
}
Upvotes: 1
Views: 626
Reputation: 947
Your problem is the following code line:
Integer character = (Integer.valueOf(characterNum));
Since you are trying to convert any character to a number and your String also contains operators(which can't be converted to numbers), you get an exception.
You should probably think about it that way:
is my character a digit?
Yes => convert it to number and push it on the stack
No => it's an operand, therefore pop the top 2 elements from the stack, perform the operation and push the result.
Upvotes: 1