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

How to solve this "java.lang.IndexOutOfBoundsException" error?

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

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

当用户选择从图书馆借一本手册时,他们会被要求输入一个索引号,该索引号表明要借图书馆的哪本书,每本手册都可以借到成功,如果输入错误的索引号他们显示 "error" 消息。

但是,如果用户输入的索引号等于图书馆中现有手册的数量,应用程序将中断并显示以下错误:

库中存储了 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();
}

如果我需要包含更多来自其他 类 的代码,请告诉我,因为我对编程还比较陌生。

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));

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