David
David

Reputation: 5

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

Upvotes: 0

Views: 96

Answers (3)

deadshot
deadshot

Reputation: 9071

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

Upvotes: 1

Nafaz M N M
Nafaz M N M

Reputation: 1698

Where is your try/catch block for the specific part? anyway, you can use IndexOutOfBound or Custome Exception for it.

1.create a custom Exception Class

  class RoomeNotFoundException extends RuntimeException
{
      public RoomeNotFoundException(String msg)
      {
             super(msg);
      }
}
  1. add try/catch block for the specific part

    public class Game
    {
    do {
               printNextRooms();
               int nextRoomIndex = getUserRoomChoice();
           if(nextRoomeIndex>3)
          {
    
           throw new RoomNotFoundException("No Rooms Available");
    
          }else{
           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));
    

    }

  2. Or you can use IndexOutOfBoundException instead of RoomNotFoundException

Upvotes: 0

Kayz
Kayz

Reputation: 667

You must have a closer look to the piece of code, where you try to access the list (or array). That is the part, where the exception is thrown, not when the user enters it. There you have to check, if the given index is larger than the size of your list.

if( index >= list.size()) {
    // handle error / print message for user
} else {
    // continue normaly
}

In your case, it would probably be in the method getConnectedRoom(int index) in class Room.

Upvotes: 0

Related Questions