【发布时间】: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