我正在编写一个程序,假设它像一个检票员。它显示可能的座位选择及其价格的图表,并询问用户是否希望按编号或价格选择座位。它的工作方式就像它在座位上的数字一样,但当我试图按价格找到一个座位时,我得到一个数组索引超出界限的错误。我很困惑,因为它假设在零处开始线性搜索。我不明白为什么会出现这种错误。
import java.util.Scanner;
public class FindTicket{
public static void main(String[] args){
String answer="number";
Scanner kb=new Scanner(System.in);
int[][] seats= {
{10,10,10,10,10,10,10,10,10,10},
{10,10,10,10,10,10,10,10,10,10},
{10,10,10,10,10,10,10,10,10,10},
{10,10,20,20,20,20,20,20,10,10},
{10,10,20,20,20,20,20,20,10,10},
{10,10,20,20,20,20,20,20,10,10},
{20,20,30,40,40,40,30,30,20,20},
{20,30,30,40,50,50,40,30,30,20},
{30,40,50,50,50,50,50,50,40,30}
};
printChart(seats);
do{
System.out.println("Would you like to choose a seat by number, price, or quit?");
answer = kb.nextLine();
if(answer.equals("price")){
sellSeatbyPrice(seats);}
if(answer.equals("number")){
sellSeatbyNumber(seats);}
printChart(seats);
}while(!answer.equals("quit"));
}
public static void printChart(int[][] seats){
for (int i=0; i<seats.length; i++)
{
for(int j=0; j<seats[0].length; j++)
{
System.out.printf("%8d", seats[i][j]);
}
System.out.println();
}
}
public static int[][] sellSeatbyPrice(int[][] seats){
Scanner kb=new Scanner(System.in);
int ticketprice;
int row = 0, col = 0;
boolean found = false, seatavaliable=true;
do{
System.out.println("What is your prefered ticket price?");
ticketprice=kb.nextInt();
while (row<seats.length && !found){
do{
if(seats[row][col] == ticketprice){
found = true;}
else{
col++; }
}while(col<seats[0].length &&!found);
if(seats[row][col] == ticketprice){
found = true;}
else{
row++;}
}
if(found){
seats[row][col] = 0; }
else {
System.out.println("Seat not found at specified price.");
seatavaliable=false;}
}while(seatavaliable==false);
return seats;
}
public static int[][] sellSeatbyNumber(int[][] seats){
Scanner kb=new Scanner(System.in);
int row = 0, col = 0;
int editedrow, editedcol;
boolean seatavaliable = true;
do{
System.out.println("What is your prefered seat number? Please enter row then column.");
row=kb.nextInt();
col=kb.nextInt();
editedrow = 9-row;
editedcol = col - 1;
if(seats[editedrow][editedcol] > 0){
seats[editedrow][editedcol] = 0;}
else{
System.out.println("Seat is not avaliable.");
seatavaliable=false;}
}while(seatavaliable==false);
return seats;
}
}
答案 0 :(得分:0)
这是因为do...while
。
完成此代码块后,col将大于数组的长度。
看看评论:
public static int[][] sellSeatbyPrice(int[][] seats){
Scanner kb=new Scanner(System.in);
int ticketprice;
int row = 0, col = 0;
boolean found = false, seatavaliable=true;
do{
System.out.println("What is your prefered ticket price?");
ticketprice=kb.nextInt();
while (row<seats.length && !found){
do{
if(seats[row][col] == ticketprice){
found = true;}
else{
col++; } // this line, in the last iteration, will make col=seats[0].length
}while(col<seats[0].length &&!found);
if(seats[row][col] == ticketprice){ //col with value greater than it should.
found = true;}
else{
row++;}
}
if(found){
seats[row][col] = 0; }
else {
System.out.println("Seat not found at specified price.");
seatavaliable=false;}
}while(seatavaliable==false);
return seats;
}
答案 1 :(得分:0)
nextInt()
方法离开\n
(结束行)符号,并由nextLine()
立即拾取,跳过下一个输入。你想要做的是使用nextLine()
作为一切,并在以后解析它:
String nextIntString = keyboard.nextLine(); //get the number as a single line
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int
这是迄今为止避免问题的最简单方法 - 不要混淆“下一步”方法。仅使用nextLine()
然后解析int
或之后单独的单词。
您无法关闭其他Scanner
,因为它会关闭基础InputStream
,因此第一个Scanner
无法再从同一InputStream
读取而您获得NoSuchElementException
1}}。
最后注意:完成后应始终关闭Scanner
以节省系统资源。