Java,字符串索引在while循环中超出范围

时间:2015-01-19 03:21:47

标签: string while-loop indexoutofrangeexception

public class Solution {
    public static void main(String[] args) {
        System.out.println(romanToInt("DCXXI"));
    }

    public static int romanToInt(String s) {
        int ln = s.length()-1;
        int ans = 0;   
        int i=0;

        while (i <=ln){
            if (s.charAt(i) == 'M'){
                ans += 1000;
            }else if (s.charAt(i) == 'D'){
                ans += 500;
            }else if (s.charAt(i) == 'C' && s.charAt(i+1)=='D'){
                    ans += 400;
                    i=i+1;
            }else if (s.charAt(i) == 'C' && s.charAt(i+1)=='M'){
                    ans += 900;
                    i=i+1;
            }else if (s.charAt(i) == 'C'){
                    ans += 100;
            }else if (s.charAt(i) == 'L'){
                ans += 50;
            }else if (s.charAt(i) == 'X' && s.charAt(i+1)=='L'){
                    ans += 40;
                    i=i+1;
            }else if (s.charAt(i) == 'X' && s.charAt(i+1)=='C'){
                    ans += 90;
                    i=i+1;
            }else if (s.charAt(i) == 'X'){
                    ans += 10;
            }else if (s.charAt(i) == 'V'){
                ans += 5;
            }else if (s.charAt(i)=='I' && s.charAt(i+1)=='V'){
                    ans += 4;
                    i=i+1;
            }else if (s.charAt(i)=='I' && s.charAt(i+1)=='X'){
                    ans += 9;
                    i=i+1;
            }else if (s.charAt(i)=='I'){
                    ans += 1;
            }
            i++;
            System.out.printf("Current sum is: %s and current pointer i is: %s \n",ans, i);
        }

        return ans;
    }
}

我不断收到错误消息

  

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:   5

但我无法找到错误的地方。有人能帮我吗? 输出: 这是D. 当前总和为:500,当前指针i为:1 这是C. 当前总和是:600,当前指针i是:2 这是X. 当前总和是:610,当前指针i是:3 这是X. 当前总和是:620,当前指针i是:4 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:5     在java.lang.String.charAt(未知来源)     在Solution.romanToInt(Solution.java:65)     在Solution.main(Solution.java:9)

3 个答案:

答案 0 :(得分:0)

你设置

int ln = s.length()-1;

并使用

while (i <=ln){....}

然后得到

s.charAt(i+1)

所以它可能是i + 1&gt; = s.length();

然后s.charAt(i + 1)将抛出异常

答案 1 :(得分:0)

这两个“else if”案件引起了例外:

        }else if (s.charAt(i+1)=='I' && s.charAt(i+1)=='V'){
         ....
        }else if (s.charAt(i+1)=='I' && s.charAt(i+1)=='X'){
         ....

答案 2 :(得分:0)

这里的问题是当你在所提供的字符串的最后一个字符时,你有时会测试string.charAt(i + 1)导致你的IndexOutofBound异常。