我正在为我正在学习的Java课程创建一个罗马数字计算器。以下方法应该采用Roman Numeral值并将其转换为整数。我在运行时不断收到StringIndexOutOfBoundsException错误,我不太明白我的错误在哪里。任何帮助,将不胜感激!
我已将罗马数字和相应的阿拉伯数字放入他们自己的数组中,如下所示:
private String[] romanArr = {"M", "D", "C", "X", "L", "V", "I"};
private int[] arabicArr = {1000, 500, 100, 50, 10, 5, 1};
以下是我的转化方法:
int convert_from_Roman(String value)
{
value.trim();
int convertedValue = 0;
for (int i = 0; i <= value.length(); i++)
{
char romanVal = value.charAt(i);
for(String romanNumeral : romanArr)
{
if (romanNumeral.equals(romanVal))
{
convertedValue += arabicArr[romanNumeral.indexOf(i)];
}
else
continue;
}
}
return convertedValue;
}
最后,这是我在main中的代码,我在其中创建变量数字并为其提供一个罗马数字字符串,以使用对象传递给方法 convert_from_Roman RomanCalculator 类并打印结果。:
RomanCalculator mc = new RomanCalculator();
String numeral = "I";
System.out.println(mc.convert_from_Roman(numeral) );
答案 0 :(得分:0)
你可以在两个地方获得和结束异常。
首先是value.charAt(i)
,因为您使用<=
代替<
将索引超过1。您可以在此处获得例外StringIndexOutOfBoundsException
。
第二个位置在arabicArr[romanNumeral.indexOf(i)]
,变量 i 是输入字符串的当前索引,它被函数indexOf()
视为char,这个当找不到char时函数返回-1,并且假设我将为0,1,2 ......,它将在第一次查找值为0的ascii代码时返回-1 ArrayIndexOutOfBoundsException
字符串 - 字符比较也将始终返回false
。
int convert_from_Roman(String value) {
value.trim(); // result of trim is ignored
int convertedValue = 0;
for (int i = 0; i <= value.length(); i++) { // your exceeding the index by 1
char romanVal = value.charAt(i);
for(String romanNumeral : romanArr) {
if (romanNumeral.equals(romanVal)) { // string - char comparison
convertedValue += arabicArr[romanNumeral.indexOf(i)]; // wrong index
}
else
continue;
}
}
return convertedValue;
}
修正了罗马方法的转换。
int convert_from_Roman(String value) {
String trimmed = value.trim(); // using the result of trim
int convertedValue = 0;
for (int digit = 0; digit < trimmed.length(); digit++) { // < instead <=
char romanVal = trimmed.charAt(digit);
for(int roman = 0; roman < romanArr.length; roman++) {
if (romanArr[roman].equals(String.valueOf(romanVal))) // char char comparison
convertedValue += arabicArr[roman]; // fixed index
else
continue;
}
}
return convertedValue;
}