0

タイプ Seat の 2D 配列を定義し、メソッドを使用して座席要素をランダムに選択し、それを「予約済み」として設定するメイン クラスがあります。

ただし、複数の座席要素をランダムに選択する必要がある場合 (ランダムに選択する必要がある場合もあります)、次のエラーが返されます。

"Exception in thread "main" java.lang.NullPointerException
    at cinemasystem.Seat.bookSeat(Seat.java:173)
    at cinemasystem.CinemaSystem.main(CinemaSystem.java:70)
Java Result: 1"

私は何が間違っているのか分かりません。おそらく私のランダムな生成方法に何か問題がありますが、とにかく助けていただければ幸いです。

メインクラス:

public static void main(String[] args) {


        Seat cinemaactual = new Seat("Cinema");
        Seat[][] cinema = new Seat[12][23];
        Seat bookedSeat = new Seat("");

        Ticket ticket = new Ticket();
        Scanner scan = new Scanner(System.in);
        String answer, contiune, list;
        cinemaactual.CreateTheatre(cinema);
        int number, check = 0, category, id;

        do {

            System.out.print("Welcome to the Theatre Booking System. (QUIT to exit)"
                    + "\nWould you like to purchase tickets or list available seats?"
                    + "(/Purchase/List/Help)");
            answer = scan.nextLine();

            if (answer.equalsIgnoreCase("purchase")) {
                do {

                    System.out.println("Please choose the cateogry of ticket "
                            + "you would like, followed by who the ticket is for"
                            + "and the amount required. (separated by a space)\n"
                            + "1. Gold\n2. Silver\n3. Bronze\n\n1. Adult\n2."
                            + " Child\n3. Concession");
                    category = scan.nextInt();
                    check = category;
                    id = scan.nextInt();
                    number = scan.nextInt();
                    if (category == 1 || category == 2 || category == 3 && id == 1 || id == 2 || id == 3) {

                        ticket.SetType(category);
                        if (category == 1) {
                            ticket.SetName("Gold");
                        } else if (category == 2) {
                            ticket.SetName("Siler");
                        } else {
                            ticket.SetName("Bronze");
                        }
                        ticket.SetNumber(number);
                        ticket.SetID(id);
                        if (id == 1) {
                            ticket.SetCategory("Adult");
                        } else if (id == 2) {
                            ticket.SetCategory("Child");
                        } else {
                            ticket.SetCategory("Bronze");
                        }
                        System.out.print("You have selected "
                                + ticket.GetNumber() + " " + ticket.GetName()
                                + " ticket(s) at the " + ticket.GetCategory() + " price.");
                        System.out.println();
                        ticket.BuyTicket(category, id);
                        bookedSeat = Seat.bookSeat(cinema, number);


                    } else {

                        System.out.print("Sorry, incorrect input, please enter an apropriate value.");
                        check = scan.nextInt();
                    }
                } while (check == 0 || check > 3);

                do {
                    System.out.print("Would you like to perchase more tickets? (Yes/No)");
                    contiune = scan.nextLine();


                    if (contiune.equalsIgnoreCase("Yes")) {
                        System.out.print("Would you like to list available seats? (Yes/No) (A/G/S/B)");
                        list = scan.nextLine();
                        cinemaactual.DisplayTheatre(cinema);
                        if (list.equalsIgnoreCase("Yes")) {
                            cinemaactual.DisplayTheatre(cinema);

                        }
                    }

私の座席クラスで座席をランダムに選択する方法:

 public static Seat bookSeat(Seat[][] x, int number){
        int count = 0;
        Seat book = new Seat("");
        Random rand = new Random();
        while(count < number){
    if (x != null) {

        do {
        book = x[rand.nextInt(x.length)][rand.nextInt(x.length)];
        book.bookSeat(true);}

        while (book.isBooked());
    }   count++; }
    return book;
}

座席クラスの 172 行目と 173 行目

172:book = x[rand.nextInt(x.length)][rand.nextInt(x.length)];

173: book.bookSeat(true);}

クラス Seat の CreateTheater メソッド:

 public Seat[][] CreateTheatre(Seat[][] x) {

        for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 4; col++) {
                x[row][col] = new Seat("B");
            }
        }
        for (int row = 8; row < 12; row++) {
            for (int col = 0; col < 4; col++) {
                x[row][col] = new Seat("S");
            }
        }

        for (int row = 0; row < 8; row++) {
            for (int col = 19; col < 23; col++) {
                x[row][col] = new Seat("B");
            }
        }
        for (int row = 8; row < 12; row++) {
            for (int col = 19; col < 23; col++) {
                x[row][col] = new Seat("S");
            }
        }
        for (int row = 3; row < 5; row++) {
            for (int col = 4; col < 9; col++) {
                x[row][col] = new Seat("B");
            }
        }
        for (int row = 3; row < 5; row++) {
            for (int col = 14; col < 19; col++) {
                x[row][col] = new Seat("S");
            }
        }
        for (int row = 9; row < 12; row++) {
            for (int col = 7; col < 4; col++) {
                x[row][col] = new Seat("S");
            }
        }
        for (int row = 3; row < 5; row++) {
            for (int col = 14; col < 20; col++) {
                x[row][col] = new Seat("B");
            }
        }

        for (int row = 5; row < 9; row++) {
            for (int col = 4; col < 9; col++) {
                x[row][col] = new Seat("S");
            }
        }

        for (int row = 5; row < 9; row++) {
            for (int col = 14; col < 20; col++) {
                x[row][col] = new Seat("S");
            }
        }
        for (int row = 6; row < 9; row++) {
            for (int col = 9; col < 14; col++) {
                x[row][col] = new Seat("G");
            }
        }
        for (int row = 9; row < 12; row++) {
            for (int col = 7; col < 16; col++) {
                x[row][col] = new Seat("G");
            }
        }

        for (int row = 9; row < 12; row++){
            for (int col = 4; col < 7; col++){
                x[row][col] = new Seat("S");
            }
        }

        for (int row = 9; row < 12; row++){
            for (int col = 16; col < 19; col++){
                x[row][col] = new Seat("S");
            }
        }
        return x;
            }
4

3 に答える 3

1

NullPointerException例外の根本的な原因はCreateTheatreメソッドにあると思います。シート配列のすべての行と列(つまり12 * 23)がSeatオブジェクトで埋められていることを確認してください。

いくつかの観察:

  1. colこのループは、で初期化され7、と比較されるため、何も実行しないようです<4

    for (int row = 9; row < 12; row++) {
        for (int col = 7; col < 4; col++) {
            x[row][col] = new Seat("S");
        }
     }
    
  2. このループ

    for (int row = 3; row < 5; row++) {
        for (int col = 14; col < 19; col++) {
            x[row][col] = new Seat("S");
        }
    }
    

    同じ行を使用しているが列が重複しているため、このループと重複しているようです。

    for (int row = 3; row < 5; row++) {
        for (int col = 14; col < 20; col++) {
            x[row][col] = new Seat("B");
        }
     }
    

結局、いくつかのシートは以下のように初期化されないままになります。これは、メソッドNullPointerExceptionで使用されるときに発生します。bookSeat()

B, B, B, B, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, B, B, B, B
B, B, B, B, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, B, B, B, B
B, B, B, B, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, B, B, B, B
B, B, B, B, B,    B,    B,    B,    B,    null, null, null, null, null, B,    B,    B,    B,    B,    B, B, B, B
B, B, B, B, B,    B,    B,    B,    B,    null, null, null, null, null, B,    B,    B,    B,    B,    B, B, B, B
B, B, B, B, S,    S,    S,    S,    S,    null, null, null, null, null, S,    S,    S,    S,    S,    S, B, B, B
B, B, B, B, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, B, B, B
B, B, B, B, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, B, B, B
S, S, S, S, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, S, S, S
S, S, S, S, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, S, S, S
S, S, S, S, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, S, S, S
S, S, S, S, S,    S,    S,    S,    S,    G,    G,    G,    G,    G,    S,    S,    S,    S,    S,    S, S, S, S

すべてのシートを初期化したい場合は、以下のようにループを更新することをお勧めしますCreateTheatre

       for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 4; col++) {
                x[row][col] = new Seat("B");;
            }
        }
        for (int row = 8; row < 12; row++) {
            for (int col = 0; col < 4; col++) {
                x[row][col] = new Seat("S");;
            }
        }

        for (int row = 0; row < 8; row++) {
            for (int col = 19; col < 23; col++) {
                x[row][col] = new Seat("B");;
            }
        }

        for (int row = 0; row < 3; row++) {
            for (int col = 4; col < 20; col++) {
                x[row][col] = new Seat("G");;
            }
        }

        for (int row = 8; row < 12; row++) {
            for (int col = 19; col < 23; col++) {
                x[row][col] = new Seat("S");;
            }
        }
        for (int row = 3; row < 5; row++) {
            for (int col = 4; col < 9; col++) {
                x[row][col] = new Seat("B");;
            }
        }
        for (int row = 3; row < 5; row++) {
            for (int col = 8; col < 20; col++) {
                x[row][col] = new Seat("S");;
            }
        }
        for (int row = 9; row < 12; row++) {
            for (int col = 7; col < 14; col++) {
                x[row][col] = new Seat("S");;
            }
        }
        for (int row = 9; row < 12; row++) {
            for (int col = 14; col < 20; col++) {
                x[row][col] = new Seat("B");;
            }
        }

        for (int row = 5; row < 9; row++) {
            for (int col = 4; col < 9; col++) {
                x[row][col] = new Seat("S");;
            }
        }

        for (int row = 5; row < 9; row++) {
            for (int col = 14; col < 20; col++) {
                x[row][col] = new Seat("S");;
            }
        }
        for (int row = 5; row < 9; row++) {
            for (int col = 9; col < 14; col++) {
                x[row][col] = new Seat("G");;
            }
        }
        for (int row = 9; row < 12; row++) {
            for (int col = 7; col < 16; col++) {
                x[row][col] = new Seat("G");;
            }
        }

        for (int row = 9; row < 12; row++){
            for (int col = 4; col < 7; col++){
                x[row][col] = new Seat("S");;
            }
        }

        for (int row = 9; row < 12; row++){
            for (int col = 16; col < 19; col++){
                x[row][col] = new Seat("S");;
            }
        }

さらに、bookSeat()行と列が同じではないため(Seat [12] [23]-> 12行23列)、メソッドでこのステートメントを変更したいと思います。

     book = x[rand.nextInt(x.length)][rand.nextInt(x.length)];

x[0].length以下のように列の長さとして使用するには:

      book = x[rand.nextInt(x.length)][rand.nextInt(x[0].length)];
于 2012-10-29T18:09:43.500 に答える
1

ロジックをチェックした場合、内部の値が null になるCreateTheatre可能性があります。cinema1 つのループを使用して、デフォルト値を配列内に配置します。

からまで、次にまでの0値のみを入力する行の例を見てみましょう。それとは別に、私はあなたが値を満たしているのを見ません。041923

for(int i = 0; i<cinema.length;i++)
    for(int j=0; j<cinema[i].length;j++)
      cinema[i][j] = new Seat("");

更新: 空席を置きたくない場合は、電話をかける前に null チェックを追加できますbook.bookSeat(true)

if(book != null){
 book.bookSeat(true);
}

を使用して多次元配列を印刷できますArrays.deepToString(cinema)

他のスレッドの使用で指摘されているようにbook = x[rand.nextInt(12)][rand.nextInt(23)]

于 2012-10-29T18:03:02.880 に答える
1

これがエラーが発生する理由かどうかはわかりません。どの行から来ているのかわかりませんが、これは今のところ間違っています:

これをして:

Seat[][] cinema = new Seat[12][23];

次に、これを行います。

book = x[rand.nextInt(x.length)][rand.nextInt(x.length)];

これは次と同等です:

book = x[rand.nextInt(12)][rand.nextInt(12)]

あなたが実際にやりたいことは次のとおりです。

book = x[rand.nextInt(12)][rand.nextInt(23)]

このことを考慮:

Seat[] y = x[rand.nextInt(x.length)];
book = y[rand.nextInt(y.length)];
于 2012-10-29T18:04:45.117 に答える