Java ArrayIndexOutOfBoundException具有设置的元素数

Java ArrayIndexOutOfBoundException具有设置的元素数,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我试图模拟一个终端/文件系统。现在我正在分析和标记这些命令 我试图确定什么是有效的命令。我的策略是检查输入数组中的index 2元素是否不是字符串“empty”。如果是,我的checkValidCommand方法将返回false 当我运行程序并以“hi”的形式输入输入时,当前出现此错误: 我相信这个问题是由于我的String[]输入只有3个元素造成的 代码: 检查有效输入 private static boolean checkValidCommand(String[] commandT

我试图模拟一个终端/文件系统。现在我正在分析和标记这些命令

我试图确定什么是有效的命令。我的策略是检查输入数组中的index 2元素是否不是字符串“empty”。如果是,我的
checkValidCommand
方法将返回false

当我运行程序并以
“hi”
的形式输入输入时,当前出现此错误:

我相信这个问题是由于我的
String[]输入只有3个元素造成的

代码:

检查有效输入

    private static boolean checkValidCommand(String[] commandTokens) {
        //boolean valid = false;
        if (commandTokens[0].equals("exit")) {
            return true;
        }
        else if (!commandTokens[2].equals("empty")) {
            return false;
        }
        return true;
    }
解析命令的代码

String[] input = new String[3];

        for (int i = 0; i < input.length; i++) {
            input[i] = "empty";
        }

        while(!input[0].equals("exit")) {
            Scanner sc = new Scanner(System.in);
            input = sc.nextLine().split(" ");
            if (checkValidCommand(input)) {
                System.out.print("Invalid Command!");
                continue;
            }
            System.out.println(input.length);
            switch(input[0]) {
                // vi
                case "vi":
                    System.out.println("hi");
                    break;
                // ls
                case "ls":
                    break;
                // mkdir
                case "mkdir":
                    break;
                // pwd  
                case "pwd":
                    break;
            }   
        }
String[]输入=新字符串[3];
for(int i=0;i
命令

input = sc.nextLine().split(" ");
不使用数据填充现有数组(由
输入引用)

它创建一个新的数组,并将其引用分配给
输入


无论
input
指向的是什么,它都会被取消引用并被垃圾收集。

我不知道如何在Java中获取数组的长度(我将假设它是
array.length()
,对于这个答案,请原谅我的错误)但基本上,您访问第二个元素时没有确保
sc.nextLine().split(“”)将实际为您返回3个元素

因此,我建议改变:

if (checkValidCommand(input)) {


您提供什么作为输入?字符串。例如“Hi”,那么
input=sc.nextLine().split(“”)的结果是什么?通过空格字符拆分
字符串
“Hi”
。创建的数组将包含多少个元素?您能在这里为我们突出显示MainActivity.java文件中的第43行吗?因此您无法访问索引2处的元素,因为没有。我明白了。然而,我现在对如何首先初始化输入感到非常困惑。正如您所说,使用
split
将取消对以前的
输入的引用,并为新的
输入创建一个新数组。但是,如何初始化
输入
,以便在
while循环
中使用测试用例?您不能也实际上不需要这样做。只需检查数组长度。
if (checkValidCommand(input)) {
if (input.length() > 2 && checkValidCommand(input)) {