Java 中的罗马计算器故障。我的 for 循环中的 StringIndexOutOfBounds
Roman Calculator troubles in Java. StringIndexOutOfBounds in my for loop
我正在为我正在学习的 Java 课程创建一个罗马数字计算器。以下方法应该采用罗马数字值并将其转换为整数。我在运行时不断收到 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 中的代码,我在其中创建变量 numeral 并给它一个罗马数字字符串以传递给方法 convert_from_Roman 使用 RomanCalculator class 的对象并打印结果。:
RomanCalculator mc = new RomanCalculator();
String numeral = "I";
System.out.println(mc.convert_from_Roman(numeral) );
你可以在两个地方获取和越界异常。
第一名在 value.charAt(i)
中,因为您使用 <=
而不是 <
超出索引 1。这是您获得异常 StringIndexOutOfBoundsException
.
的地方
第二位在arabicArr[romanNumeral.indexOf(i)]
,变量i是输入字符串的当前索引,被函数indexOf()
,这个函数 returns -1 当没有找到 char 时,假设 i 将是 0, 1, 2...,它会在第一次查找时 return -1对于值为 0 的 ascii 代码抛出 ArrayIndexOutOfBoundsException
.
还有一个字符串 - 字符比较 return 总是 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;
}
我正在为我正在学习的 Java 课程创建一个罗马数字计算器。以下方法应该采用罗马数字值并将其转换为整数。我在运行时不断收到 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 中的代码,我在其中创建变量 numeral 并给它一个罗马数字字符串以传递给方法 convert_from_Roman 使用 RomanCalculator class 的对象并打印结果。:
RomanCalculator mc = new RomanCalculator();
String numeral = "I";
System.out.println(mc.convert_from_Roman(numeral) );
你可以在两个地方获取和越界异常。
第一名在 value.charAt(i)
中,因为您使用 <=
而不是 <
超出索引 1。这是您获得异常 StringIndexOutOfBoundsException
.
第二位在arabicArr[romanNumeral.indexOf(i)]
,变量i是输入字符串的当前索引,被函数indexOf()
,这个函数 returns -1 当没有找到 char 时,假设 i 将是 0, 1, 2...,它会在第一次查找时 return -1对于值为 0 的 ascii 代码抛出 ArrayIndexOutOfBoundsException
.
还有一个字符串 - 字符比较 return 总是 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;
}