【问题标题】:ArrayIndexOutOfBoundsException in arguments array参数数组中的 ArrayIndexOutOfBoundsException
【发布时间】:2014-09-17 06:29:03
【问题描述】:

输入文件:file1.cmd

A = 7
B = 8

代码

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] 的新值?我很困惑。

【问题讨论】:

  • 为什么要给 args 赋值?那可能是个坏主意。
  • 您正在使用 main 的 args 数组,如果您只是在编译器中运行,它可能没有参数且长度为 0。您需要声明自己的数组。在那之后,您可能会从未检查的 sc.nextLine() 中获得更多错误。
  • 如果没有更多的命令行参数要处理,我该如何结束循环?我知道在读取命令行参数时使用扫描仪没有意义。我想一次读取一个命令行,处理它然后读取下一个命令行参数
  • 首先让我们弄清楚你的术语。如果您在 Command Prompt 窗口中(在 Windows 上)并输入类似 java MainProgram 1 15 3 的内容,那么您输入的是 命令行 和参数 1153命令行参数。您从文件中读取的内容不是“命令行参数”。
  • 你知道什么是命令行参数吗?您无需手动阅读,它将自动在args 数组中提供。如果您运行命令java -jar Commander.jar A = 7 B = 8,该数组将为[A, =, 7, B, =, 8]

标签: java command-line-arguments indexoutofboundsexception


【解决方案1】:

你正在重用 main() 方法中的 args 数组,如果你没有传入任何命令行参数,它的长度将为零。如果您不知道要读取多少行,您真的想使用单独的数组或列表。

【讨论】:

    【解决方案2】:

    您当前的错误是因为您试图将值分配给 args 数组,该数组是空的,不应该在您的情况下使用。

    当您从命令提示符 (windows) 运行 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 可以是任何布尔值。例如,您可以检查他们是否输入了“QUIT”行,或者您是否位于文件末尾。

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多