Java 字符串索引外边界异常

Java 字符串索引外边界异常,java,hashmap,challenge-response,Java,Hashmap,Challenge Response,大家好,我正在写一个程序,把罗马数字转换成阿拉伯数字。但是,我一直遇到StringIndexOutOfBoundsException的问题:字符串索引超出范围:-1。下面是我的代码 package com.company; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args

大家好,我正在写一个程序,把罗马数字转换成阿拉伯数字。但是,我一直遇到StringIndexOutOfBoundsException的问题:字符串索引超出范围:-1。下面是我的代码

package com.company;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        System.out.println(romanToArabic("CIV"));
    }
    public static int romanToArabic(String romanNumeral){
        Map <Character, Integer> map = new HashMap<>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);

        int result = 0;
        for (int i=0; i < romanNumeral.length(); i++){
            int current = map.get(romanNumeral.charAt(i));
            int next = map.get(romanNumeral.charAt(i-1));
            if (i>0 && current > next){
                result += current - 2*next;
            }

            result += current;
        }
        return result;
    }
package.com公司;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
系统输出打印LN(罗马语(“CIV”);
}
公共静态int-romantorabic(字符串罗马数字){
Map Map=newhashmap();
地图放置('I',1);
地图放置('V',5);
地图放置('X',10);
地图放置('L',50);
地图放置('C',100);
地图放置('D',500);
地图放置('M',1000);
int结果=0;
for(int i=0;i0&¤t>next){
结果+=当前-2*下一步;
}
结果+=电流;
}
返回结果;
}

当您第一次遍历循环(i=0)时,“i-1”是-1

当“i=0”时,您的问题出现在您的第一次“for循环”迭代中

在下一行中,您可以正确地得到一个索引为“0”的字符“C”

然后在下一行,当代码执行语句时,“i”变成-1(i-1)

因此,您尝试获取索引为“-1”的字符

它将跟随您进入字符串索引外边界异常


因为字符串索引从零开始,正如前面提到的,您从i=0开始,然后尝试(i-1)的操作

通过在i=1处启动循环或仅执行此行(以及代码的其余部分)来修复此问题:


如果i大于或等于1。

for(int i=0;
那么
charAt(i-1)
,您会惊讶地发现它在“索引-1超出范围”时失败??你期望它做什么?但是注意循环中的if条件。它不应该失败。看看这篇文章并告诉我。我做了几乎相同的事情。但是思想似乎不起作用。什么
if
条件?charAt(I-1)调用不在
if
语句中。
int next = map.get(romanNumeral.charAt(i-1));
int current = map.get(romanNumeral.charAt(i));
int next = map.get(romanNumeral.charAt(i-1));
int next = map.get(romanNumeral.charAt(-1));
int next = map.get(romanNumeral.charAt(i-1));