Java 字符串索引越界错误

Java 字符串索引越界错误,java,string,indexoutofboundsexception,Java,String,Indexoutofboundsexception,bellow类包含一个fromRomanToArabic方法。在这个方法中,我试图将一个阿拉伯数字转换为罗马数字。该方法的作用如下: 从对象中获取用户字符串 穿过绳子 将与字符关联的值相加。如果关联的字符数大于上一个,则从总和中扣除字符值。 这是我的密码: package romantoarabicnums; import javax.swing.JOptionPane; public class RomanToArabicNums { private static String

bellow类包含一个fromRomanToArabic方法。在这个方法中,我试图将一个阿拉伯数字转换为罗马数字。该方法的作用如下:

从对象中获取用户字符串 穿过绳子 将与字符关联的值相加。如果关联的字符数大于上一个,则从总和中扣除字符值。 这是我的密码:

package romantoarabicnums;

import javax.swing.JOptionPane;


public class RomanToArabicNums {
    private static String userString;
    private static int userNumber;
    private static char letter;
    private static int letterNum;

    public RomanToArabicNums (String s) throws NumberFormatException {
        for (int i = 0; i < s.length(); i++) {

           if (s.charAt(i) == 'M' ||s.charAt(i) == 'D' ||s.charAt(i) == 'C' ||s.charAt(i) == 'X' ||
               s.charAt(i) == 'V' ||s.charAt(i) == 'I' ||s.charAt(i) == 'L') {
               userString += s.charAt(i);
           }
           else {throw new NumberFormatException("Only M,C,D,X,V and I allowed");}
        }
    }
    public RomanToArabicNums (int num) throws NullPointerException {
       if (num >= 1 && num <= 3999) {
           RomanToArabicNums.userNumber = num;
       }
       else {throw new NumberFormatException("numbers between 1 and 3999 only!");}
    }
    public RomanToArabicNums (char let, int num) {
        RomanToArabicNums.letter = let;
        RomanToArabicNums.letterNum = num;
    }
    public static void main(String[] args) {
        RomanToArabicNums r2 = new RomanToArabicNums("MCMXCV");
        System.out.println("the arabic number is: " + r2.fromRomanToArabic());

    }
    /* convert Roman characters to Arabic numbers */
    public int fromRomanToArabic () {
            int sum = 0;

            for (int i = 0; i <= userString.length(); i++) {
                /**/
                if (userString.charAt(i) == 'M') {
                    sum += 1000;
                }
                /**/
                if (userString.charAt(i) == 'D') {
                    if (userString.charAt(i + 1) == 'M') {
                        sum -= 500;
                    } else {
                        sum += 500;
                    }
                }
                /**/
                if (userString.charAt(i) == 'C') {
                    if (userString.charAt(i + 1) == 'M' || userString.charAt(i + 1) == 'D') {
                        sum -= 100;
                    } else {
                        sum += 100;
                    }
                }
                /**/
                if (userString.charAt(i) == 'L') {
                    if (userString.charAt(i + 1) == 'M' || userString.charAt(i + 1) == 'D'
                            || userString.charAt(i + 1) == 'C') {
                        sum -= 50;
                    } else {
                        sum += 50;
                    }
                }
                /**/
                if (userString.charAt(i) == 'X') {
                    if (userString.charAt(i + 1) == 'M' || userString.charAt(i + 1) == 'D'
                            || userString.charAt(i + 1) == 'C' || userString.charAt(i + 1) == 'L') {
                        sum -= 10;
                    } else {
                        sum += 10;
                    }
                }
                /**/
                if (userString.charAt(i) == 'V') {
                    if (userString.charAt(i + 1) == 'M' || userString.charAt(i + 1) == 'D'
                            || userString.charAt(i + 1) == 'C' || userString.charAt(i + 1) == 'L'
                            || userString.charAt(i + 1) == 'X') {
                        sum -= 5;
                    } else {
                        sum += 5;
                    }
                }
                /**/
                if (userString.charAt(i) == 'I') {
                    if (userString.charAt(i + 1) == 'M' || userString.charAt(i + 1) == 'D'
                            || userString.charAt(i + 1) == 'C' || userString.charAt(i + 1) == 'L'
                            || userString.charAt(i + 1) == 'X' || userString.charAt(i + 1) == 'V') {
                        sum -= 1;
                    } else {
                        sum += 1;
                    }
                }
            }
            return sum;

    }
}
下面是错误:


注意:我认为错误是由于字符串元素的数量少于for循环中的步骤

所以字符串是零基数,您必须运行循环直到:I
还有更多的错误,您从字符串长度中获取一个字符。

指的是以下的Javadoc:

[throws]IndexOutOfBoundsException-如果索引参数为负或不小于此字符串的长度

因此,无论在何处调用userString.charAt,都需要确保索引满足以下条件:


我一点也不知道。但您可以在方法中执行以下操作:

   for (int i = 0; i <= userString.length(); i++)
您应该这样做:

   for (int i = 0; i < userString.length(); i++)

在循环中使用userString.charAti+1时,除了Jens和Andy的答案之外,还应该检查i+1 如果您位于最后一个字符的索引处,这也会导致IndexOutOfBoundsException


请注意,您需要相应地处理最后一个字符,或者保留i代码中有两个问题。一个是显而易见的——你正在循环int i=0;我认为这不是代码的唯一问题。他还在代码中的不同位置调用userString.charAti+1,因此即使他修复了for,它仍然会抛出该异常。@zamzam这不是同一个错误,只是同一种错误。如果您在更改循环保护前后仔细查看堆栈跟踪,您将看到异常在不同的行上抛出。@zamzam没有相同的错误。但是字符串中的索引有很多错误。@Jens由于charAti+1,他仍然会收到IndexOutOfBoundsException。.可能重复向名为RomanToArabicNums的类添加阿拉伯语到罗马的转换功能的原因是什么?谢谢你的回答!这几乎解决了问题。我得到的返回int值是1990。对于MCMXCV,它应该返回1995年感谢您的回答!这几乎解决了问题。我得到的返回int值是1990。对于MCMXCV,它应该返回1995@zamzam正如我所说的,你需要将你的逻辑分别应用到循环后的最后一个字符,因为你打破它太早了。
if ((there is a next character) AND (the next character is 'M')) {
   for (int i = 0; i <= userString.length(); i++)
   for (int i = 0; i < userString.length(); i++)
for (int i = 0; i <= userString.length(); i++) {
for (int i = 0; i < userString.length() - 1; i++) {