如何在Java中阻止此超出范围的异常

时间:2015-12-07 17:56:59

标签: java hashmap indexoutofboundsexception bluej

您好我想知道如何编写try和catch块来阻止以下错误。

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

我有这个方法,它接受一个句子并将其拆分为ArrayList。然后,我使用它将值存储到散列映射中,其中索引1是键,后面的单词变为值。我使用以下方法将用户输入拆分为数组。

私人扫描仪阅读器;

    /**
     * Create a new InputReader that reads text from the text terminal.
     */
    public InputReader()
    {
        reader = new Scanner(System.in);
    }

    public ArrayList<String> getInput() 
    {
        System.out.print("> ");                // print prompt
        String inputLine = reader.nextLine().trim().toLowerCase();

        String[] wordArray = inputLine.split(" ");  // split at spaces

        // add words from array into ArrayList
        ArrayList<String> words = new ArrayList<String>();
        for(String word : wordArray) {
            words.add(word);
        }
        return words;
    }

}

以下方法使用上面的类来检测用户输入。因此,当用户输入写入时,他们可以写入散列映射,但是如果他们在输入键和值之前按下返回,我会得到超出范围的异常。那么如何重写以下方法以避免这种情况呢?

 public void start()
    {

        boolean finished = false;


            printWelcome();
            while(!finished) {
                ArrayList<String> input = reader.getInput();

                if(input.contains("shutdown")) {
                    finished = true;
                }

                if (input.contains("load")) {
                    System.out.println();
                    instruct.readAndFill();
                    System.out.println();
                }            

                if (input.contains("write")) {
                    String key = input.get(1);
                    String value = "";
                    for(int i=2; i<input.size(); i++) {
                        value = value + " " + input.get(i);
                    }
                    instruct.mapWrite(key, value);
                }
            } 
            instructorGoodBye();
        }

很抱歉,如果我不够清楚,或者我的代码没有达到标准,那我现在只学习了大约2个月。

3 个答案:

答案 0 :(得分:2)

  

基本上如果用户在一行上输入写入键值就可以了,但是如果他们在写入后点击返回则会发生错误。

所以,从根本上说,你所缺少的是错误检查。您的程序正在从用户那里获取输入,并假设它是有效的。 这总是一个坏主意

相反,您应该验证从用户那里获得的内容。一种方法,你可以做到这一点,为你的&#34;写&#34;阻止,是为了确保你期望在那里的元素实际存在。

首先,我会按如下方式重写你的循环:

while(!finished) {
    List<String> input = reader.getInput();
    if(input.size() == 0) {
        throw new IllegalArgumentException("Must specify command, one of 'shutdown', 'load', 'write'");
    }

    final String command = input.remove(0).toLowerCase();
    // TODO: Make sure command is one of the valid commands!

请注意更改:

  1. 分配到List代替ArrayList只是一种很好的通用做法。
  2. 检查输入以确保其元素数不超过零
  3. 采取第一个要素,因为我们不想做List.contains()。考虑输入garbage garbage garbage write,显然我们不希望这个调用&#34;写&#34;命令,应该被视为无效输入。
  4. 最后,我们使用它来重写执行命令的条件:

    if(command.equals("write")) {
        // Make sure the user put the right stuff in here
        // Since we removed the command from the input already, just make sure what is left is 
        if(input.size() <= 1) {
            throw new IllegalArgumentException("Must specify correct data");
        }
        String key = input.remove(0);
        String value = String.join(" ", input); // Java 8
        instruct.mapWrite(key, value);
    }
    

答案 1 :(得分:0)

您收到以下部分代码的错误..

if (input.contains("write")) {
                    String key = input.get(1);// here is the problem..
                    String value = "";
                    for(int i=2; i<input.size(); i++) {
                        value = value + " " + input.get(i);
                    }
                    instruct.mapWrite(key, value);
                } 

在此代码段的第2行中。 您正在使用索引访问值。现在想象一下,您只需在控制台中输入一个单词即可。所以你将从getInput()方法得到的arraylist的大小为1.所以..在arraylist中,这个单词将被放置在第0个位置。(这是第一个位置)但你正在访问第二个位置的值..这为您提供了债券例外的指数..

答案 2 :(得分:0)

基本上修复比抛出新异常并使用try和catch块更简单。我所要做的只是略微改变逻辑,只使用if else语句。

SqlBulkCopy

从目前为止我从java中学到的,最好的解决方案通常总是最简单的。感谢所有的帮助,每个评论并试图帮助我的人基本上帮助我提出了这个想法。