Java 获取错误代码,但不要';我不知道为什么
我需要为一个分数计算器写一个代码,它可以加、减、乘、除两个分数。我有这个代码,正在收到错误消息Java 获取错误代码,但不要';我不知道为什么,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我需要为一个分数计算器写一个代码,它可以加、减、乘、除两个分数。我有这个代码,正在收到错误消息 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 Cal
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;
}
}
如果找不到字符串,
String.indexOf
方法将返回-1。在这个小插曲中,您有:
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!
乌格的回答是对的。。顺便说一句,你的run()方法包含很多错误(我试过运行它) 我想固定版本对你会有用的。。这里是:(检查substring()方法;))
该消息告诉您,第24行的字符串索引超出了范围。您的集成开发环境是否显示第24行是哪一行?当您有类似input.indexOf(“”)的行时,可能找不到任何空格。这将使索引返回-1。所以现在我知道这是一个愚蠢的问题,但出于某种原因,它返回输入的内容,而不进行任何计算。我知道这与返回输入有关;但我不知道如何更改它以返回答案。我使用了调试器,发现程序的第二个方法甚至没有被执行。我对java还是新手。提前感谢您的帮助。@diy900好,在
返回输入之前
在run()
方法中,您应该调用calculate()
方法。您可以通过以下操作实现此Sobstiting返回输入:字符串res=calculate(输入,a,b,c,d);返回res非常感谢您的帮助。我的问题解决了。我知道这很简单,只是因为我对java还不熟悉,所以我不知道该怎么解决它。
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;
}