如何处理此IndexOutOfBounds异常?

问题描述 投票:0回答:3

我正在开发一个基于文本的冒险游戏,需要一些帮助来处理getUserRoomChoice()函数上的IndexOutOfBounds异常。我在菜单上的索引为3,因此当用户输入数字> 3时,它将引发该异常。我尝试在提示用户“选择数字”的行上使用try-catch,但没有捕获它。

这是我的主要班级:

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

房间等级

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);
        }
    }
}
java exception indexoutofboundsexception
3个回答
0
投票

您必须仔细查看这段代码,尝试在其中访问列表(或数组)。那是引发异常的部分,而不是用户输入异常的部分。您必须在此处检查给定的索引是否大于列表的大小。

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

在您的情况下,可能在类getConnectedRoom(int index)中的方法Room中。


0
投票

特定部分的try / catch块在哪里?无论如何,您可以为其使用IndexOutOfBound或Custome Exception。

1。创建自定义异常类

  class RoomeNotFoundException extends RuntimeException
{
      public RoomeNotFoundException(String msg)
      {
             super(msg);
      }
}
  1. 为特定部分添加try / catch块

    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. 或者您可以使用IndexOutOfBoundException代替RoomNotFoundException


0
投票

您必须在getNextRoom()的函数调用中使用try-catch。因为getNextRoom(nextRoomIndex)导致了异常。您必须将这两个语句放在try块中。

将此更改为

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

try{
    Room nextRoom = getNextRoom(nextRoomIndex);
    updateRoom(nextRoom);
} catch(Exception e){
    System.out.println("print something");
}
© www.soinside.com 2019 - 2024. All rights reserved.