2016-12-04 98 views
0

我正在为我的AP计算机科学课的分数计算器程序工作。该代码编译并运行,但是当我输入任何输入时,除了退出之外,还有一个错误。输入8_9/4 + 3/7有以下错误:分数计算器输入错误

线程“main”异常java.lang.NumberFormatException:对于输入字符串:“4 + 3/7”。

有人能帮我弄清楚有什么问题吗?

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!"); 
    } 
} 

回答

2

您收到此错误,因为你试图解析String为整数,即使它不是一个整数。这是有问题的行:

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

此输入8_9/4 + 3/7

This fraction.indexOf("/")返回斜线的第一个匹配项。所以,下面的表达式fraction.substring(fraction.indexOf("/") + 1)返回4 + 3/7,它不是一个整数,所以它不能使用Integer.parseInt来解析。

如果你想获得的唯一4代替4 + 3/7,您可以取代你行:

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

你没有正确地提取“分数”的字符串。当你做Integer.parseInt()时要小心。它没有考虑方程式。

在你写的代码:

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

的fraction.substring(0,fraction.indexOf( “/”)将返回 “8_9” 的字符串,它是不会被识别的Integer.parseInt。

尝试在调试运行,并设置断点Interger.parseInt打破了可视化的值。

+0

我不熟悉如何进行调试。我是什么找什么关系呢?我如何设置断点?什么是断点? – agb1158

+0

它们是2种调试方法1)插入console.out.println打印变量。 2)使用IDE在特定行设置断点。如果你使用视觉工作室,它会很容易 – hygoh2k

+0

调试是一个基本的技能,我建议你在YouTube或谷歌寻找“在visual studio中调试c#”。那里有很多资源。让我知道你是否有麻烦。 – hygoh2k