-2

チケットファインダーのように振る舞うと思われるプログラムを書いています。可能な座席の選択肢とその価格のチャートを表示し、ユーザーが座席を番号で選択するか価格で選択するかを尋ねます。番号で座席を指定すると思われるように機能しますが、価格で座席を見つけようとすると、配列インデックスが範囲外のエラーになります。ゼロから線形検索を開始すると想定されているため、混乱しています。このエラーが発生する理由がわかりません。

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

}
4

2 に答える 2

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;
  }
于 2013-03-15T01:45:40.437 に答える
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

これは、問題を回避する最も簡単な方法です。「次の」方法を混在させないでください。onlynextLine()を使用してから s を解析するintか、後で単語を分離します。


Scanner基になる を閉じるため、InputStream別のものを閉じるScannerことはできません。InputStreamNoSuchElementException


最後の注意:Scannerシステム リソースを節約するために、使い終わったら必ず を閉じる必要があります。

于 2013-03-15T01:45:52.690 に答える