Java 字符串索引越界错误
bellow类包含一个fromRomanToArabic方法。在这个方法中,我试图将一个阿拉伯数字转换为罗马数字。该方法的作用如下: 从对象中获取用户字符串 穿过绳子 将与字符关联的值相加。如果关联的字符数大于上一个,则从总和中扣除字符值。 这是我的密码:Java 字符串索引越界错误,java,string,indexoutofboundsexception,Java,String,Indexoutofboundsexception,bellow类包含一个fromRomanToArabic方法。在这个方法中,我试图将一个阿拉伯数字转换为罗马数字。该方法的作用如下: 从对象中获取用户字符串 穿过绳子 将与字符关联的值相加。如果关联的字符数大于上一个,则从总和中扣除字符值。 这是我的密码: package romantoarabicnums; import javax.swing.JOptionPane; public class RomanToArabicNums { private static String
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
请注意,您需要相应地处理最后一个字符,或者保留i
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++) {