0

I am working on a fraction calculator program for my AP Computer Science class. This code compiles and runs, however when I put in any input, besides quit, there is an error. With an input 8_9/4 + 3/7 there is an error of:

Exception in thread "main" java.lang.NumberFormatException: For input string: "4 + 3/7".

Can someone please help me figure out what's wrong?

import java.util.*;

public class FracCalc {
   public static void main(String[] args) {
      typeEquation();
   }
   public static void typeEquation() {
      System.out.print("Enter an equation, or \"quit\" : ");
      Scanner scan = new Scanner(System.in);
      String fraction = scan.nextLine();
      String secondOperator;

      if (fraction.equalsIgnoreCase("quit")) {
         finish();
      }
      else {
      produceAnswer(fraction);
      }
   }
   public static void produceAnswer(String fraction) {
        int whole2;
        int numerator2;
        int denominator2;
        int whole1;
        int numerator1;   //all caps identifier thing?
        int denominator1;
        String operator = fraction.substring((fraction.indexOf(" ")) + 1);  

        if (fraction.contains("_")) {
           whole2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_")));
           numerator2 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/")));
           denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
           numerator2 = whole2 * denominator2 + numerator2;  
        } 
        else if (fraction.contains("/")) {
           numerator2 = Integer.parseInt(fraction.substring(0,fraction.indexOf("/")));
           denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
        }
        else {
           whole2 = Integer.parseInt(fraction.substring(0));
           numerator2 = whole2;
           denominator2 = 1;
        }

        if (fraction.contains("_")) {
           whole1 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_")));
           numerator1 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/")));
           denominator1 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
           numerator1 = (whole1*denominator1) + numerator1; 
        }
        else if (fraction.contains("/")) {
           numerator1 = Integer.parseInt(fraction.substring(0, fraction.indexOf("/")));
           denominator1 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
        } 
        else {
           whole1 = Integer.parseInt(fraction.substring(0));
           numerator1 = whole1;
           denominator1 = 1;
        }


        if (fraction.contains("_")) { 
           whole2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_")));
           numerator2 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/")));
           denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
           numerator2 = whole2 * denominator2 + numerator2;  
        } 
        else if (fraction.contains("/")) {
           numerator2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("/")));
           denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
        }
        else {
           whole2 = Integer.parseInt(fraction.substring(0));
           numerator2 = whole2;
           denominator2 = 1;
        }    
        if (operator.equals("+")) {
        System.out.println(addingFractions(numerator1, numerator2, denominator1, denominator2));
        }
        else if (operator.equals("*")) {
        System.out.println(multiplyingFractions(numerator1, numerator2, denominator1, denominator2));
        } 
        else { 
            int x = numerator2;
            int y = denominator2;
            denominator2 = x;
            numerator2 = y;
            System.out.println(multiplyingFractions(numerator1, numerator2, denominator1, denominator2));
        }
        int dividend = (denominator1 * numerator2) + (numerator1 * denominator2); 
        int divisor = denominator1 * denominator2;
        int remainder = dividend % divisor;
        while (remainder != 0){
           dividend = divisor;
           divisor = remainder;
           remainder = dividend % divisor; 
        }   
   }
   public static String multiplyingFractions(int numerator1, int numerator2, int denominator1, int denominator2) {
       int newNumerator = numerator1 * numerator2;
       int newDenominator = denominator1 * denominator2;

       int divisor = reducingFractions(newNumerator, newDenominator);
       newNumerator /= divisor;
       newDenominator /= divisor;

       int integerComponent = 0;

       while (newNumerator >= newDenominator) {
           integerComponent++;
           newNumerator -= newDenominator;
       }
       String answer = "";
       if (integerComponent > 0) {
           answer += integerComponent + "_";
       }
       if (newNumerator != 0) {
           answer += reducingFractions(newNumerator, newDenominator);
       }
       return answer;
   }
   public static String addingFractions(int numerator1, int numerator2, int denominator1, int denominator2) {
      int newNumerator = (numerator1 * denominator2) + (numerator2 * denominator1);
      int newDenominator = denominator1 * denominator2;
      int divisor = reducingFractions(newNumerator, newDenominator);
      newNumerator /= divisor;
      newDenominator /= divisor;
      int integerComponent = 0;
      while (newNumerator >= newDenominator) {
          integerComponent++;
          newNumerator -= newDenominator;
      }
      String answer = "";
      if (integerComponent > 0) {
          answer += integerComponent + "_";
      }
      if (newNumerator != 0) {
          answer += newNumerator + "/" + newDenominator;
      }
      return answer;
   }
   public static int reducingFractions(int newNumerator, int newDenominator) {
      int newNumerator_abs = Math.abs (newNumerator);
      int newDenominator_abs = Math.abs (newDenominator);
      int minimumNumber = Math.min (newNumerator_abs, newDenominator_abs);
      int divisor = 1;

      for (int i = 1; i <= minimumNumber; i++) {
         if (newNumerator % i == 0 && newDenominator % i == 0){
            divisor = 1;
         }
      }
      return divisor;
   }
   public static void finish() {
      System.out.println("Goodbye!");
   }
}
ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
agb1158
  • 31
  • 2

2 Answers2

2

You are getting this error, because you try to parse a String as integer, even if it isn't an integer. This is the problematic line:

denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));

for this input 8_9/4 + 3/7.

This fraction.indexOf("/") returns you the first occurrence of the slash. So, the following expression fraction.substring(fraction.indexOf("/") + 1) returns 4 + 3/7 which is not an integer, so it cannot be parsed using Integer.parseInt.

If you want to get only 4 instead of 4 + 3/7, you can replace your line with:

denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1, fraction.indexOf(" ")));
ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
0

You did not extract the "fraction" string correctly. Be careful when you do Integer.parseInt(). It doesn't take in equation.

In the code that you wrote:

else if (fraction.contains("/")) {
       numerator2 = Integer.parseInt(fraction.substring(0,fraction.indexOf("/")));
       denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1));
    }

The fraction.substring(0,fraction.indexOf("/") will return "8_9" as string. Which is not recognisable by Integer.parseInt.

Try to run in debug and set the breakpoint to break at Interger.parseInt for visualising the values.

hygoh2k
  • 2,060
  • 2
  • 12
  • 7
  • I'm not familiar with how to debug. What am I looking for it to do? How do I set the breakpoint? And what is a breakpoint? – agb1158 Dec 07 '16 at 08:02
  • They are 2 approaches to debug. 1) inserting the console.out.println to printout the variables . 2) using IDE to set breakpoint at specific line . If u r using visual studio it gonna be very easy – hygoh2k Dec 07 '16 at 11:05
  • Debugging is kinda fundamental skill, I'd suggest you looking for "debugging c# in visual studio" in YouTube or google. There are plenty of resources there . Let me know if you have trouble. – hygoh2k Dec 07 '16 at 11:10