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;
}