【问题标题】:Array out of bounds exception with scanning user input into an array将用户输入扫描到数组时出现数组越界异常
【发布时间】:2014-06-18 22:13:02
【问题描述】:

嘿,我有一个项目的代码,我试图完成一个项目,但我一直在某个部分遇到数组超出范围的异常,并且想知道如何修复它。我的项目是使用 3 类 Room、Reservation 和一个客户端类创建一个预订系统。在询问房间的客人人数后,我的 bookRoom 课程遇到问题。任何帮助将不胜感激。异常发生在预订类的第 57 行。有问题的行以粗体显示。

`

public class Reservation {
    public void roomInitialization(Room[] room,int numberOfRooms,int numberOfSmokingRooms)
    {
        boolean smoking=true;
        String[] guestName={null,null,null,null};

        for (int i=0;i<numberOfRooms;i++)
        {
        if (i>=numberOfSmokingRooms)
            smoking=false;
        room[i]=new Room(smoking,false,guestName,null,i+1);
        }
    }
    public  void displayRoomsInfo(Room[] room,int numberOfRooms)
    {
         for (int i=0;i<numberOfRooms;i++)
         {
        System.out.println("Room " + room[i].getroomNumber() + "\t" + 
                     (room[i].getsmoking()?"Smoking room":"Non-Smoking Room"));
        if (room[i].getoccupied())
        {
            System.out.print("Phone: "+room[i].getguestPhone()+"\t");
            for(int j=0;j<4;j++)
                System.out.print(room[i].getguestName()[j]+"\t");
            System.out.println();
        }
         }
    }



        public void bookRoom (Room[] room, int numberOfRooms)
         {
            displayRoomsInfo(room, numberOfRooms);  
            Scanner scan = new Scanner(System.in);
            Scanner scans = new Scanner(System.in);
            Scanner scand = new Scanner(System.in);
            System.out.print("Enter a Room Number: ");
            int roomNumber = scan.nextInt()-1;
            if (roomNumber >=0 && roomNumber < 30){
                room[roomNumber].setoccupied(true);
                System.out.print("Enter a Phone Number: ");
                String guestPhone = scans.nextLine();
                room[roomNumber].setguestPhone(guestPhone);

                System.out.print("Enter number of guests:(Max of 4 per room) ");
                int guests = scand.nextInt()-1;
                String[] guestName = new String[guests];
                for (int i=0;i<guestName.length;i++)
                    System.out.print("Enter guest names: ");

                    **guestName[guests] = scand.next();**
                room[roomNumber].setguestName(guestName);


            }
            else
                System.out.println("Enter a valid room number");


         }




    public void checkOut(Room[] room)
    {
         Scanner scan=new Scanner(System.in);
         int roomNumber;
         String[] nullguestName={null,null,null,null};
         do
         {
        System.out.print("Enter the room number: ");
        roomNumber=scan.nextInt()-1;
        if (roomNumber>=0 && roomNumber<30)
            break;
        else
            System.out.println("Enter a valid room number");
         }while(true);
         if (room[roomNumber].getoccupied())
         {
        room[roomNumber].setoccupied(false);
        room[roomNumber].setguestPhone(null);
        room[roomNumber].setguestName(nullguestName);
         }
         else
        System.out.println("room "+(roomNumber+1)+" is already empty");
    }


}
`
Code for the other classes



        package hotel;

    public class Room {
        private boolean smoking;
        private boolean occupied;
        private String[] guestName=new String[4];
        private String guestPhone;
        private int roomNumber;

        public Room (boolean smoking,boolean occupied,String[] guestName, String guestPhone,int roomNumber)
        {
            this.smoking=smoking;
            this.occupied=occupied;
            for (int i=0;i<4;i++)
                this.guestName[i]=guestName[i];
            this.guestPhone=guestPhone;
            this.roomNumber=roomNumber;
        }


        public void setoccupied(boolean occupied) {
            this.occupied = occupied;

        }

        public void setsmoking(boolean smoking) {
            this.smoking = smoking;

        }
        public void setroomNumber(int roomNumber) {
            this.roomNumber = roomNumber;

        }

        public void setguestPhone(String guestPhone) {
            this.guestPhone = guestPhone;

        }
        public void setguestName(String[] guestName)
        {
            for (int i=0;i<4;i++)
                this.guestName[i]=guestName[i];
        }

        public boolean getsmoking() {
            return this.smoking;
        }

        public boolean getoccupied(){
        return this.occupied;
    }
    public String getguestPhone(){
        return this.guestPhone;
    }
    public int getroomNumber() {
        return this.roomNumber;
    }



    public String[] getguestName()
    {
        String[] tempguestName=new String[4];
        for (int i=0;i<4;i++)
            tempguestName[i]=this.guestName[i];
        return tempguestName;
    }




    }


    package hotel;

    import java.util.Scanner;

    public class ReservationDemo {
        public static void main(String[]args)
        {
            final int numberOfRooms=30, numberOfSmokingRooms=5;
            Room[] room=new Room[numberOfRooms];
            Reservation reservation=new Reservation();
            reservation.roomInitialization(room,numberOfRooms,numberOfSmokingRooms);
            int userSelection;
            Scanner scan=new Scanner(System.in);
            do
            {
            System.out.println("Press: 1-Book room\t2-checkout\t3-display all rooms\t4-exit. ");
            userSelection=scan.nextInt();
            switch(userSelection)
            {
            case 1:

                reservation.bookRoom(room,numberOfRooms);
                break;
            case 2:
                reservation.checkOut(room);
                break;
            case 3: 
                reservation.displayRoomsInfo(room,numberOfRooms);
                break;
            case 4:
                System.exit(0);
            default:
                break;
            }
            }while (true);


    }
    }

【问题讨论】:

  • 在从 i=0 开始的 for 循环中使用长度时,它将在 i == 长度处失败。假设长度为 10,那么您将从 0 迭代到 9,则 10 处的元素将超出范围。因此,您的哨兵应该是长度 - 1。
  • 我以为我已经用 'int guest = scand.nextInt()-1;' 解决了这个问题在第 55 行。

标签: java arrays exception indexoutofboundsexception


【解决方案1】:

你的代码有很多错误。

首先--在 Reservation 类中使用以下代码而不是您的版本

  System.out.print("Enter number of guests:(Max of 4 per room) ");
                int guests = scand.nextInt();
                String[] guestName = new String[guests];
                for (int i=0;i<guestName.length;i++) {
                    System.out.print("Enter guest names: ");
                    guestName[i] = scand.next();
            }

Second -- 在 Room 类中使用以下方法而不是现有方法。

public void setguestName(String[] guestName)
    {
        for (int i=0;i<guestName.length;i++)
            this.guestName[i]=guestName[i];
    }

让我知道你的成就

【讨论】:

    【解决方案2】:

    您正在尝试使用变量guests 来索引guests 数组,该变量是数组的大小,您应该使用迭代计数器变量i

    guestName[guests] = scand.next() 应该是guestName[i] = scand.next()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多