如何解决这个" java.lang.IndexOutOfBoundsException"错误?

时间:2015-01-02 20:38:08

标签: java indexing numbers

目前我正在为一个存储手册的图书馆应用程序编写代码,并允许用户在一段时间内借用所述手册。

我几乎完成了应用程序但是我遇到了一个我无法解决的令人困惑的问题。

当用户选择从库中借用手册时,会要求他们输入索引号,该索引号说明借阅库中的哪本书,可以成功借用每本手册,如果输入了错误的索引号,则会显示用"错误"消息。

但是,如果用户输入的索引号等于库中存在的手册数量,则应用程序会切断并显示以下错误:

enter image description here

一旦2个手册存储在库中就会发生此错误,然后用户输入" 2"作为索引号。

以下是我目前正在使用的代码,如果有人可以告诉我导致此错误的原因:

public static void borrowManual(){
    displayManualList();

    //register user's Manual choice.
    ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 0, Library.ManualList.size()));

    borrowLoop:
    while(Menu.menuChoice == 3){
        //Check if the Manual to be borrowed is available.
        //ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 1, Library.ManualList.size()));

        if ((ManualList.get(ManualChoice).status.equalsIgnoreCase(status1)) && (ManualList.size() >= ManualChoice)){
            //Print the borrowed Manual information and change the Manual status to borrowed.
            ManualList.get(ManualChoice).status = "Borrowed";
            ManualList.get(ManualChoice).borrower = User.userName;
            ManualList.get(ManualChoice).borrowDate = "Today.";
            ManualList.get(ManualChoice).returnDate = "In two weeks.";
            //Add the borrowed Manual to the borrowedManuals arraylist:
            borrowedManuals.add(ManualList.get(ManualChoice));

            System.out.printf("\n==========================================================================\n");
            System.out.printf("\n\nYou have chosen the following Manual:\n\n %s\n\n", ManualList.get(ManualChoice).displayManual());
            System.out.println("Please return the Manual within two weeks!\n");
            System.out.println("\n--------------------------------------------------------------------------");
            System.out.println("\n                             Manual borrowed!\n");
            System.out.println("--------------------------------------------------------------------------\n");
            break borrowLoop;

        }else if(ManualList.get(ManualChoice).status.equalsIgnoreCase(status2) && ManualList.size() >= ManualChoice){
            System.out.println("\n\n--------------------------------------------------------------------------");
            System.out.println("\nError! The manual you wish to borrow is already on loan.");
            System.out.println("\n--------------------------------------------------------------------------\n");
            break borrowLoop;

        }else if(ManualChoice > ManualList.size()-1){
            System.out.println(Messages.noSuchManualMessage);
            break borrowLoop;
        }
    }
    Menu.displayMenu();
}

如果我需要包含更多来自其他课程的代码,请告诉我,因为我对编程相对较新。

2 个答案:

答案 0 :(得分:1)

ArrayList有2个元素(即其size()为2)时,有效索引为012超出范围。

ManualChoice必须< ManualList.size()。它不能等于它。

你应该改变

ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 0, Library.ManualList.size()));

ManualChoice = (Console.readInteger(Messages.enterManualIndexMessage, Messages.ManualIndexNotInListMessage, 0, Library.ManualList.size() - 1));

答案 1 :(得分:1)

当使用ArrayLists和tables这样的东西时,必须记住计算机从0开始计数,而不是1.因此,如果数组列表的大小为4,则其索引为0,1,2,3。您可以做的是在让他们查看手册之前检查用户输入的索引是否是有效输入。