2014-12-05 91 views
-1

我需要爲分數計算器編寫代碼,可以對兩部分進行加,減,乘和除。我有這樣的代碼,並正在錯誤消息獲取錯誤代碼,但不知道爲什麼

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
    at java.lang.String.substring(Unknown Source) 
    at Calculator.run(Calculator.java:24) 
    at Calculator.main(Calculator.java:13) 

我知道錯誤訊息給我我需要修復的地方,但我想不出什麼我做錯了。我對Java仍然很陌生,所以它可能是一個非常簡單的修復。

預先感謝您。

import java.util.*; 

    public class Calculator { 
    public static void main(String[] args) { 
     System.out.println("Please enter two fractions to add, subtract, multiply, or divide\nor\nType 'quit' to exit the program."); 
     Boolean on = true; 
     Scanner console = new Scanner(System.in); 
     while (on) { 
      String input = console.nextLine(); 
      if (input.equalsIgnoreCase("quit")) { 
       on = false; 
      } else 
       System.out.println(run(input)); 
     } 
    } 

    public static String run(String input) { 
     int indexOfSecondSpace = 0; 
     int indexOfOperation = 0; 
     String firstNumber = "0"; 
     String secondNumber = "0"; 
     int beginning = input.indexOf(" ") + 1; 
     int end = input.indexOf(" ", input.indexOf(" ")); 
     String operator = input.substring(beginning, end); 
     if (input.contains("+") == true) { 
      indexOfOperation = input.indexOf("+"); 
     } else if (operator.equals("-")) { 
      indexOfOperation = input.indexOf("-"); 
     } else if (operator.equals("*")) { 
      indexOfOperation = input.indexOf("*"); 
     } else if (operator.equals("/")) { 
      indexOfOperation = input.indexOf("/"); 
     } 
     firstNumber = (input.substring(input.indexOf(" "))); 
     secondNumber = (input.substring(input.indexOf(" ") + 1)); 
     int a = 0; 
     int b = 0; 
     int c = 0; 
     int d = 0; 
     if (firstNumber.contains("/")) { 
      a = Integer.parseInt(firstNumber.substring(0,firstNumber.indexOf("/"))); 
      b = Integer.parseInt(firstNumber.substring(0),firstNumber.indexOf("/")); 
     } else if (!firstNumber.contains("/")) 
      a = Integer.parseInt(input.substring(0, input.indexOf(" "))); 
      b = Integer.parseInt("1"); 
     { 
      if (secondNumber.contains("/")) { 
       c = Integer.parseInt(secondNumber.substring(secondNumber.indexOf("/"))); 
       d = Integer.parseInt(secondNumber.substring(secondNumber.indexOf("/" + 1, secondNumber.length()))); 
      } else if (!secondNumber.contains("/")) { 
       c = Integer.parseInt(secondNumber.substring(secondNumber.length())); 
       d = Integer.parseInt("1"); 
      } 
     } 
     return input; 

    } 
    public static String calculate(String input, int a, int b, int c, int d){ 
    if (input.contains ("+")) 
    { 
     System.out.println("your answer is " + (a*d + b*c)+"/" +(b*d)); 
    } 
    else if (input.contains("-")) 
    { 
     System.out.println("your answer is " + (a*d - b*c)+ "/" +(b*d)); 
    } 
    else if (input.contains("/")) 
    { 
     System.out.println("your answer is " + (a*d)/(b*c)+ "/" +(b*d)); 
    } 
    else if (input.contains("*")) 
    { 
     System.out.println("your answer is " + (a*c) +"/" +(b*d)); 
    } 
    return input; 
} 
} 
+0

的消息告訴你,你在線路24有一個字符串索引越界貴集成開發環境顯示出哪些線是線24?當你有像input.indexOf(「」)這樣的行時,你可能找不到任何空格。這會使indexOf返回-1。 – rajah9 2014-12-05 21:36:48

回答

2

如果未找到字符串,String.indexOf方法將返回-1。在這個snipplet您有:

int beginning = input.indexOf(" ") + 1; 
int end = input.indexOf(" ", input.indexOf(" ")); 

int beginning = input.indexOf(" ") + 1; // = -1 + 1 = 0 
int end = input.indexOf(" ", input.indexOf(" ")); // input.indexOf(" ", -1); ERROR! 

所得而你可能換貨是:

int beginning = input.indexOf(" ") + 1; // = -1 + 1 = 0 
int end = input.indexOf(" ", beginning); // input.indexOf(" ", 0); Great job! 
0

ug_的答案是正確的..順便說一下,你的方法的run()包含大量的錯誤(我試圖運行它)

我認爲一個固定的版本會對你有用..這裏是:(檢查子()方法;))

public static String run(String input) { 
int indexOfSecondSpace = 0; 
int indexOfOperation = 0; 
String firstNumber = "0"; 
String secondNumber = "0"; 
int beginning = input.indexOf(" ") + 1; 
int end = input.indexOf(" ", beginning); 
String operator = input.substring(beginning, end); 
if (input.contains("+") == true) { 
    indexOfOperation = input.indexOf("+"); 
} else if (operator.equals("-")) { 
    indexOfOperation = input.indexOf("-"); 
} else if (operator.equals("*")) { 
    indexOfOperation = input.indexOf("*"); 
} else if (operator.equals("/")) { 
    indexOfOperation = input.indexOf("/"); 
} 
firstNumber = (input.substring(0, input.indexOf(" "))); 
secondNumber = (input.substring(beginning + 1)); 
int a = 0; 
int b = 0; 
int c = 0; 
int d = 0; 
if (firstNumber.contains("/")) { 
    a = Integer.parseInt(firstNumber.substring(0,firstNumber.indexOf("/"))); 
    b = Integer.parseInt(firstNumber.substring(0,firstNumber.indexOf("/"))); 
} else if (!firstNumber.contains("/")) 
    a = Integer.parseInt(input.substring(0, input.indexOf(" "))); 
    b = Integer.parseInt("1"); 
{ 
    if (secondNumber.contains("/")) { 
     c = Integer.parseInt(secondNumber.substring(secondNumber.indexOf("/")+1)); 
     d = Integer.parseInt(secondNumber.substring(secondNumber.indexOf("/")+1)); 
    } else if (!secondNumber.contains("/")) { 
     c = Integer.parseInt(secondNumber.substring(secondNumber.length())); 
     d = Integer.parseInt("1"); 
    } 
} 
return input; 
} 
+0

所以現在我知道這是一個愚蠢的問題,但由於某種原因,它正在返回所投入的內容,而沒有進行任何計算。我知道這與回報輸入有關;但我不知道如何改變它返回一個答案。我用調試器發現我的程序的第二種方法甚至沒有被執行。再次,我是新來的Java。先謝謝您的幫助。 – diy900 2014-12-10 16:04:37

+0

@ diy900好了,在'return()'方法之前的'return input;'應該調用你的'calculate()'方法。你可以用下面的代碼實現這個抽象的'return input':String res = calculate(input,a,b,c,d);返回資源;' – 2014-12-10 16:14:10

+0

這個幫助是非常贊成的。我解決了問題。我知道這是一件簡單的事情,它剛剛成爲Java的新手,我並不確切知道修復它的鋤頭。 – diy900 2014-12-10 16:41:23

相關問題