arguments数组中的ArrayIndexOutOfBoundsException

时间:2014-09-16 21:30:57

标签: java command-line-arguments indexoutofboundsexception

输入文件:file1.cmd

A = 7
B = 8

CODE

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

public class Commander
{
    public static void main(String[] args)
    {
        Map<String,Integer> expression = new HashMap<String,Integer>();

        Scanner sc = new Scanner(System.in);
        String Variable, assignmentOperator;
        int Value, i = 0;

        while(true)
        {
            args[i] = sc.nextLine();
            args[i + 1] = sc.nextLine();
            args[i + 2] = sc.nextLine();

            expression.put(args[i],Integer.parseInt(args[i + 2]));

            for(String key: expression.keySet())
                System.out.println(key + " - " + expression.get(key));

            if(!sc.hasNextLine()) break;

            ++i;

        }
    }
}

我收到以下错误:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Commander.main(Commander.java:17)

我很难解决此错误,感谢任何帮助。根据我的cmd文件,A是args [0],=是args [1],7是args [2],然后启动一个新行,其中B是args [0]的新值?我很困惑。

2 个答案:

答案 0 :(得分:2)

你正在从main()方法重用args数组,如果你没有传递任何命令行参数,它将是零长度。你真的想要使用一个单独的数组,或者如果你不知道你将阅读多少行列表。

答案 1 :(得分:0)

您当前的错误是因为您正在尝试为args数组指定值,该数组为空,不应在您的情况下使用。

当您从命令提示符(窗口)运行Java程序时,程序名称后面的额外字符串(以空格分隔)将位于您的参数列表中。

java RunningThisProgram 7 8

您的计划可以是:

public static void main(String[] args)
{
    System.out.println(args[0]); //prints "7"
    System.out.println(args[1]); //prints "8"
}

如果您在启动程序之前知道自己的参数,那么这很好。但是,让我们说你想让程序运行,然后把东西传递到控制台。或者,从文件中读取它们。

public static void main(String[] args)
{
    //args is an empty array, pretend it doesn't even exist
    String[] inputLines = new String[10];//This array has enough room for 10 entries
    //Now you have an empty array you can read lines in and assign values to
}

请注意,我们将指定的长度设置为10.数组不能自动动态调整大小。读取任意数量项目的最简单方法是使用某种类型的List,最有可能是ArrayList。您还可以使用您读入的第一个字符串,即用户希望添加的条目数。


在阅读完评论后,我会补充一点,您认为自己遇到问题的是while循环中的条件。您应该更改条件(true

while (true)将继续自行运行。你似乎是在你的while循环中调用break,这可能有用,但不是一个很好的方法。

你会想要

while (yourCondition)
{
    //doStuff
}

yourCondition可以是任何布尔值。您可以检查他们是否输入了行&#34; QUIT&#34;,或者如果您位于文件的末尾,例如。