当我尝试重新定义变量时,我得到一个索引超出范围的错误

时间:2013-10-26 21:50:10

标签: java arraylist hashmap

我正在构建一个程序来充当带内存的计算器,因此您可以提供变量及其值。每当我试图重新定义一个变量a = 5,到a = 6时,我得到一个超出范围的索引错误。

public static void main(String args[])
{
    LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
    Scanner scan = new Scanner(System.in);
    ArrayList<Integer> values = new ArrayList<>();
    ArrayList<String> variables = new ArrayList<>();

    while(scan.hasNextLine())
    {
        String line = scan.nextLine();
        String[] tokens = line.split(" ");


        if(!Character.isDigit(tokens[0].charAt(0)) && !line.equals("clear") && !line.equals("var"))
        {
            int value = 0;
            for(int i=0; i<tokens.length; i++)
            {
                if(tokens.length==3)
                {
                    value = Integer.parseInt(tokens[2]);
                    System.out.printf("%5d\n",value);
                    if(map.containsKey(tokens[0]))
                    {
                        values.set(values.indexOf(tokens[0]), value);
                        variables.set(variables.indexOf(tokens[0]), tokens[0]);
                    }
                    else
                    {
                        values.add(value);
                    }
                    break;
                }

                else if(tokens[i].charAt(0) == '+')
                {
                    value = addition(tokens, value);
                    System.out.printf("%5d\n",value);
                    variables.add(tokens[0]);
                    if(map.containsKey(tokens[0]))
                    {
                        values.set(values.indexOf(tokens[0]), value);
                        variables.set(variables.indexOf(tokens[0]), tokens[0]);
                    }
                    else
                    {
                        values.add(value);
                    }
                    break;
                }

                else if(i==tokens.length-1 && tokens.length != 3)
                {
                    System.out.println("No operation");
                    break;
                }
            }
            map.put(tokens[0], value);

        }       

        if(Character.isDigit(tokens[0].charAt(0)))
        {
            int value = 0;
            if(tokens.length==1)
            {
                System.out.printf("%5s\n", tokens[0]);
            }

            else
            {
                value = addition(tokens, value);
                System.out.printf("%5d\n", value);
            }
        }

        if(line.equals("clear"))
        {
            clear(map);
        }

        if(line.equals("var"))
        {
            variableList(variables, values);
        }       
    }
}

public static int addition(String[] a, int b)
{
    for(String item : a)
    {
        if(Character.isDigit(item.charAt(0)))
        {
            int add = Integer.parseInt(item);
            b = b + add;
        }   
    }
    return b;
}

public static void clear(LinkedHashMap<String,Integer> b)
{
    b.clear();
}

public static void variableList(ArrayList<String> a, ArrayList<Integer> b)
{
    for(int i=0; i<a.size(); i++)
    {
        System.out.printf("%5s: %d\n", a.get(i), b.get(i));
    }
}

我包含了整个代码,因为我不确定错误的来源。

Error

我假设错误是由于将值存储在ArrayLists中而引起的。

1 个答案:

答案 0 :(得分:3)

这一行:

values.set(values.indexOf(tokens[0]), value);

投掷ArrayIndexOutOfBoundsException

您正在values查找当前存在变量名称"a"的地方,显然是为了覆盖它。

但是,这没有任何意义:valuesList的{​​{1}},因此它永远不会包含您的变量名称Integer

因此,"a"会返回List.indexOf(Object)。当你试图调用-1传递List.set(E, int)时,它会爆炸。