Search code examples
javaexceptionindexoutofboundsexception

How can I handle this IndexOutOfBounds exception?


I am working on a text-based adventure game and need some help handling the IndexOutOfBounds exception on the getUserRoomChoice() function. I have an index of 3 on the menu so when the user enters a number > 3, it throws that exception. I tried using a try-catch on the line where it prompts the user to "Select a Number" but it is not catching it.

Here is my main class:

import java.util.Scanner;

public class Game {
    private static Room library, throne, study, kitchen;
    private static Room currentLocation;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
       initialSetupGame();
       String reply;
       do {
           printNextRooms();
           int nextRoomIndex = getUserRoomChoice();
           Room nextRoom = getNextRoom(nextRoomIndex);
           updateRoom(nextRoom);
           System.out.print("Would you like to continue? Yes/No: ");
           reply = input.nextLine().toLowerCase();
    } while ('y' == reply.charAt(0));
       goodbye();
    }

    public static void initialSetupGame() {
        // Instantiate room objects of type Room
        library = new Room("Library");
        throne = new Room("Throne");
        study = new Room("Study");
        kitchen = new Room("Kitchen");

        // Connect the objects to each other
        library.addConnectedRoom(throne);
        library.addConnectedRoom(study);
        library.addConnectedRoom(kitchen);

        throne.addConnectedRoom(library);
        throne.addConnectedRoom(study);
        throne.addConnectedRoom(kitchen);

        study.addConnectedRoom(library);
        study.addConnectedRoom(throne);
        study.addConnectedRoom(kitchen);

        kitchen.addConnectedRoom(library);
        kitchen.addConnectedRoom(study);
        kitchen.addConnectedRoom(throne);

        // Welcome message
        System.out.println("Welcome to Aether Paradise, "
                + "a game where you can explore"
                + " the the majestic hidden rooms of Aether.");

        // Prompt user for a name
        Scanner input = new Scanner(System.in);
        System.out.print("\nBefore we begin, what is your name? ");
        String playerName = input.nextLine();
        System.out.print("\n" + playerName +"? Ah yes. The Grand Warden told us"
                + " to expect you. Nice to meet you, " + playerName + "."
                + "\nMy name is King, a member of the Guardian Aethelorian 12"
                + " who protect the sacred rooms of Aether."
                + "\nAs you hold the Warden's signet ring, you have permission"
                + " to enter.\n\nAre you ready to enter? ");

        String response = input.nextLine().toLowerCase();
        if ('n' == response.charAt(0)) {
            System.out.println("Very well then. Goodbye.");
            System.exit(0);
        }
        if ('y' == response.charAt(0)) {
            System.out.println("\nA shimmering blue portal appeared! You leap "
                    + "inside it and your consciousness slowly fades...");
        }
        else {
            System.out.println("Invalid input. Please try again.");
            System.exit(1);
        }


        // Set the player to start in the library
        currentLocation = library;
        System.out.print("\nYou have spawned at the library.");

        System.out.println(currentLocation.getDescription());

    }
    public static void printNextRooms() {
        // Lists room objects as menu items
        System.out.println("Where would you like to go next?");
        currentLocation.printListOfNamesOfConnectedRooms();
    }
    // How to handle the exception when input > index?
    public static int getUserRoomChoice() {
        Scanner input = new Scanner(System.in);
        System.out.print("(Select a number): ");
        int choice = input.nextInt();
        return choice - 1;
    }
    public static Room getNextRoom(int index) {
        return currentLocation.getConnectedRoom(index);
    }
    public static void updateRoom(Room newRoom) {
        currentLocation = newRoom;
        System.out.println(currentLocation.getDescription());
    }

    public static void goodbye() {
        System.out.println("You walk back to the spawn point and jump into"
                + "the portal... \n\nThank you for exploring the hidden rooms "
                + "of Aether Paradise. Until next time.");
    }
}

Room Class

import java.util.ArrayList;

public class Room {
    // Instance variables
    private String name;
    private String description;
    private ArrayList<Room> connectedRooms;

    // Overloaded Constructor
    public Room(String roomName) {
        this.name = roomName;
        this.description = "";
        connectedRooms = new ArrayList<>();
    }

    // Overloaded Constructor
    public Room(String roomName, String roomDescription) {
        this.name = roomName;
        this.description = roomDescription;
        connectedRooms = new ArrayList<>();
    }

    // Get room name
    public String getName() {
        return name;
    }

    // Get room description
    public String getDescription() {
        return description;
    }

    // Add connected room to the array list
    public void addConnectedRoom(Room connectedRoom) {
        connectedRooms.add(connectedRoom);
    }

    // Get the connected room from the linked array
    public Room getConnectedRoom(int index) {
        if (index > connectedRooms.size()) {
            try { 
                return connectedRooms.get(index);
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return connectedRooms.get(index);
    }
    // Get the number of rooms
    public int getNumberOfConnectedRooms() {
        return connectedRooms.size();
    }
    // Print the connected rooms to the console
    public void printListOfNamesOfConnectedRooms() {
        for(int index = 0; index < connectedRooms.size(); index++) {
            Room r = connectedRooms.get(index);
            String n = r.getName();
            System.out.println((index + 1) + ". " + n);
        }
    }
}

Solution

  • You have to use try-catch in function call of getNextRoom(). Because getNextRoom(nextRoomIndex) is causing the exception. You have to put those two statements in try block.

    Change this to

    Room nextRoom = getNextRoom(nextRoomIndex);
    updateRoom(nextRoom);
    

    this

    try{
        Room nextRoom = getNextRoom(nextRoomIndex);
        updateRoom(nextRoom);
    } catch(Exception e){
        System.out.println("print something");
    }