具有设定元素数的ArrayIndexOutOfBoundException

时间:2014-03-17 02:32:37

标签: java indexoutofboundsexception

我正在尝试模拟终端/文件系统。现在我正在解析和标记命令。

我正在尝试确定什么是有效命令。我的策略是检查输入数组中的索引2元素是否为字符串" empty"以外的其他元素。如果是,我的checkValidCommand方法将返回false。

我正在运行程序并输入"hi"输入时出现此错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
    at fileSystem2.MainActivity.checkValidCommand(MainActivity.java:43)
    at fileSystem2.MainActivity.main(MainActivity.java:66)

我认为这个问题是由于String[] input只有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;
            }   
        }

2 个答案:

答案 0 :(得分:1)

命令

input = sc.nextLine().split(" ");

使用数据填充现有数组(由input引用)。

它会创建一个 new 数组,并将其引用分配给input

无论input指向什么,都会被取消引用并成为垃圾收集的对象。

答案 1 :(得分:1)

我不确定如何在Java中获取数组的长度(我假设这个答案是array.length(),所以请原谅我,如果我弄错了)但基本上你是&#39;重新访问第二个元素而不确保sc.nextLine().split(" ");实际上会为你返回3个元素......

所以我建议改变:

if (checkValidCommand(input)) {

if (input.length() > 2 && checkValidCommand(input)) {