0

我正在构建一个程序来充当具有内存的计算器,因此您可以提供变量及其值。每当我尝试将变量 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));
    }
}

我包含了整个代码,因为我不确定错误是从哪里引起的。

错误

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

4

1 回答 1

3

这一行:

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

正在投掷ArrayIndexOutOfBoundsException

您正在查找values您的变量名称"a"当前存在的位置,显然是要覆盖它。

但是,这没有任何意义:values是 a Listof Integer,因此它永远不会包含您的变量名"a"

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

于 2013-10-26T22:02:24.777 回答