"main" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 17

Exception in thread "main" `java.lang.StringIndexOutOfBoundsException: String index out of range: 17`        at java.lang.String.charAt(String.java:658)
    at Stadium.<init>(Stadium.java:104)
    at StadiumPanel.main(StadiumPanel.java:53)

Я продолжаю получать это сообщение, и я не могу понять это. Я новичок в Java, и я пытаюсь сделать gui мест на стадионе из кнопок.

Это мой код модели:

public class Stadium { 
 public static int ROWS = 27; 
 public static int COLUMNS = 35; 

 private static String[] SEAT_NUMBERS = { 
 "9 1234567890 123456789 1234567890 1", 
 "8 1234567890 123456789 1234567890 2", 
 "7 1234567890 123456789 1234567890 3", 
 "6                                 4", 
 "55   12345678 1234567 12345678   15", 
 "44 8  1234567 1234567 1234567  1 26", 
 "33 77                         12 37", 
 "22 66   1234561234567123456   23 48", 
 "11 55 0  12345123456712345  1 34 59", 
 "99 44 98  123412345671234  12 45 11", 
 "88 33 876 --------------- 123 56 22", 
 "77 22 765|               |234 67 33", 
 "66 11 654|               |345 78 44", 
 "55       |               |       55", 
 "44 87 543|               |456 11 66", 
 "33 76 432|               |567 22 77", 
 "22 65 321 --------------- 678 33 88", 
 "11 54 21  432176543214321  89 44 99", 
 "95 43 1  54321765432154321  0 55 11", 
 "84 32   6543217654321654321   66 22", 
 "73 21                         77 33", 
 "62 1  7654321 7654321 7654321  8 44", 
 "51   87654321 7654321 87654321   55", 
 "4                                 6", 
 "3 0987654321 987654321 0987654321 7", 
 "2 0987654321 987654321 0987654321 8", 
 "1 0987654321 987654321 0987654321 9" 
 }; 

 private static String[] SEAT_ROWS = { 
 "Z CCCCCCCCCC FFFFFFFFF IIIIIIIIII K", 
 "Z BBBBBBBBBB EEEEEEEEE HHHHHHHHHH K", 
 "Z AAAAAAAAAA DDDDDDDDD GGGGGGGGGG K", 
 "Z                                 K", 
 "ZY   BBBBBBBB DDDDDDD FFFFFFFF   JK", 
 "ZY T  AAAAAAA CCCCCCC EEEEEEE  H JK", 
 "ZY TS                         GH JK", 
 "ZY TS   CCCCCCFFFFFFFIIIIII   GH JK", 
 "ZY TS X  BBBBBEEEEEEEHHHHH  L GH JK", 
 "DC TS XW  AAAADDDDDDDGGGG  KL GH AB", 
 "DC TS XWV --------------- JKL GH AB", 
 "DC TS XWV|               |JKL GH AB", 
 "DC TS XWV|               |JKL GH AB", 
 "DC       |               |       AB", 
 "DC RQ XWV|               |JKL IJ AB", 
 "DC RQ XWV|               |JKL IJ AB", 
 "DC RQ XWV --------------- JKL IJ AB", 
 "DC RQ XW  SSSSPPPPPPPMMMM  KL IJ AB", 
 "XW RQ X  TTTTTQQQQQQQNNNNN  L IJ LM", 
 "XW RQ   UUUUUURRRRRRROOOOOO   IJ LM", 
 "XW RQ                         IJ LM", 
 "XW R  OOOOOOO MMMMMMM KKKKKKK  J LM", 
 "XW   PPPPPPPP NNNNNNN LLLLLLLL   LM", 
 "X                                 M", 
 "X TTTTTTTTTT QQQQQQQQQ NNNNNNNNNN M", 
 "X UUUUUUUUUU RRRRRRRRR OOOOOOOOOO M", 
 "X VVVVVVVVVV SSSSSSSSS PPPPPPPPPP M" 
 }; 

 private static String[] SEAT_SECTIONS = { 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3                                 3", 
 "33   22222222 2222222 22222222   33", 
 "33 2  2222222 2222222 2222222  2 33", 
 "33 22                 22 33", 
 "33 22   1111111111111111111   22 33", 
 "33 22 1  11111111111111111  1 22 33", 
 "44 22 11  111111111111111  11 22 44", 
 "44 22 111 --------------- 111 22 44", 
 "44 22 111|               |111 22 44", 
 "44 22 111|           |111 22 44", 
 "44       |           |       44", 
 "44 22 111|               |111 22 44", 
 "44 22 111|           |111 22 44", 
 "44 22 111 --------------- 111 22 44", 
 "44 22 11  111111111111111  11 22 44", 
 "33 22 1  11111111111111111  1 22 33", 
 "33 22   1111111111111111111   22 33", 
 "33 22                         22 33", 
 "33 2  2222222 2222222 2222222  2 33", 
 "33   22222222 2222222 22222222   33", 
 "3                                 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3" 
 }; 

 private Seat[][] seats; 

 public Stadium() { 
     seats = new Seat[ROWS][COLUMNS]; 

     for (int r=0; r< ROWS; r++) {  String secString = SEAT_SECTIONS[r]; 
         String rowString = SEAT_ROWS[r]; 
         String numString = SEAT_NUMBERS[r]; 
         for (int c=0; c< COLUMNS; c++) { 
              -->byte section =        (byte)Character.digit(secString.charAt(c),10); 
             char row = (char)rowString.charAt(c); 
             byte number = (byte)Character.digit(numString.charAt(c),10); 
             if (!Character.isLetter(row)) 
                seats[r][c] = null; 
             else 
                seats[r][c] = new Seat(section, row, number); 
         } 
     } 
 } 

 public Seat[][] getSeats() { return seats; } 
 public Seat getSeat(int row, int col) { return seats[row][col]; } 

}

Это мой код панели:

import java.awt.*; 
import javax.swing.*; 

public class StadiumPanel extends JPanel {
private Stadium     model;

public Seat[][] seatButtons = new Seat[27][35];

public StadiumPanel(Stadium m){
    model = m;

    Seat[][] seatButtons = m.getSeats();

    setLayout(new GridLayout(27,35));
    setBackground(Color.WHITE);

    for (int row=0; row<27; row++){
        for(int col=0; col<35; col++){
            if (seatButtons[row][col] != null){
                if (seatButtons[row][col].getSection() == 1){
                    JButton b = new JButton();
                    b.setBackground(Color.RED);
                    add(b);
                }
                else if (seatButtons[row][col].getSection() == 2){
                    JButton b = new JButton();
                    b.setBackground(Color.GREEN);
                    add(b);
                }
                else if (seatButtons[row][col].getSection() == 3){
                    JButton b = new JButton();
                    b.setBackground(Color.BLUE);
                    add(b);
                }
                else if (seatButtons[row][col].getSection() == 4){
                    JButton b = new JButton();
                    b.setBackground(Color.YELLOW);
                    add(b);
                }

            }
            else if (seatButtons[row][col] == null){
                JLabel b = new JLabel();
                b.setBackground(Color.WHITE);
                add(b);
            }
        }
    }   
}

public static void main(String args[]) { 
     JFrame f = new JFrame("Stadium Panel Test"); 
      -->f.getContentPane().add(new StadiumPanel(new Stadium())); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(649, 500); 
     f.setVisible(true); 
} 

}

Буду признателен за любую помощь, спасибо!

5 ответов

Решение

Один из ваших строковых литералов в SEAT_SECTIONS имеет только 17 символов. Вы должны решить для себя, какой из них. Скорее всего, вы заполнили некоторые из этих пробелов, используя символы табуляции вместо пробелов.

Ваша первая проблема в строке 6 SEAT_SECTIONS

    "33 2  2222222 2222222 2222222  2 33",
    "33 22                 22 33", // Line 6
    "33 22   1111111111111111111   22 33",

Что слишком коротко (27 символов) вместо необходимых 35.

У вас будет такая же проблема в строках 12, 13 и 15.

    "44 22 111|           |111 22 44", // Line 12
    "44       |           |       44", // Line 13
    "44 22 111|               |111 22 44",
    "44 22 111|           |111 22 44", // Line 15

Вы должны будете дополнить эти строки соответственно. Вы также можете добавить некоторые проверки вменяемости, чтобы гарантировать, что вы ожидаете ROW а также COLUMN длины соответствуют реальности и принимают соответствующие меры, когда они этого не делают.

Лучшим решением может быть использование двумерного массива.

Я пытался воссоздать твою проблему.. но, похоже, все работает. Файлы, которые я использовал ниже, - они отображают таблицу рассадки с разноцветными кнопками. Я сделал только незначительные изменения (используя "модель" на панели стадиона; форматирование.

Файл Stadium.java

package com.example.seats;
public class Stadium { 
 public static int ROWS = 27; 
 public static int COLUMNS = 35; 

 private static String[] SEAT_NUMBERS = { 
 "9 1234567890 123456789 1234567890 1", 
 "8 1234567890 123456789 1234567890 2", 
 "7 1234567890 123456789 1234567890 3", 
 "6                                 4", 
 "55   12345678 1234567 12345678   15", 
 "44 8  1234567 1234567 1234567  1 26", 
 "33 77                         12 37", 
 "22 66   1234561234567123456   23 48", 
 "11 55 0  12345123456712345  1 34 59", 
 "99 44 98  123412345671234  12 45 11", 
 "88 33 876 --------------- 123 56 22", 
 "77 22 765|               |234 67 33", 
 "66 11 654|               |345 78 44", 
 "55       |               |       55", 
 "44 87 543|               |456 11 66", 
 "33 76 432|               |567 22 77", 
 "22 65 321 --------------- 678 33 88", 
 "11 54 21  432176543214321  89 44 99", 
 "95 43 1  54321765432154321  0 55 11", 
 "84 32   6543217654321654321   66 22", 
 "73 21                         77 33", 
 "62 1  7654321 7654321 7654321  8 44", 
 "51   87654321 7654321 87654321   55", 
 "4                                 6", 
 "3 0987654321 987654321 0987654321 7", 
 "2 0987654321 987654321 0987654321 8", 
 "1 0987654321 987654321 0987654321 9" 
 }; 

 private static String[] SEAT_ROWS = { 
 "Z CCCCCCCCCC FFFFFFFFF IIIIIIIIII K", 
 "Z BBBBBBBBBB EEEEEEEEE HHHHHHHHHH K", 
 "Z AAAAAAAAAA DDDDDDDDD GGGGGGGGGG K", 
 "Z                                 K", 
 "ZY   BBBBBBBB DDDDDDD FFFFFFFF   JK", 
 "ZY T  AAAAAAA CCCCCCC EEEEEEE  H JK", 
 "ZY TS                         GH JK", 
 "ZY TS   CCCCCCFFFFFFFIIIIII   GH JK", 
 "ZY TS X  BBBBBEEEEEEEHHHHH  L GH JK", 
 "DC TS XW  AAAADDDDDDDGGGG  KL GH AB", 
 "DC TS XWV --------------- JKL GH AB", 
 "DC TS XWV|               |JKL GH AB", 
 "DC TS XWV|               |JKL GH AB", 
 "DC       |               |       AB", 
 "DC RQ XWV|               |JKL IJ AB", 
 "DC RQ XWV|               |JKL IJ AB", 
 "DC RQ XWV --------------- JKL IJ AB", 
 "DC RQ XW  SSSSPPPPPPPMMMM  KL IJ AB", 
 "XW RQ X  TTTTTQQQQQQQNNNNN  L IJ LM", 
 "XW RQ   UUUUUURRRRRRROOOOOO   IJ LM", 
 "XW RQ                         IJ LM", 
 "XW R  OOOOOOO MMMMMMM KKKKKKK  J LM", 
 "XW   PPPPPPPP NNNNNNN LLLLLLLL   LM", 
 "X                                 M", 
 "X TTTTTTTTTT QQQQQQQQQ NNNNNNNNNN M", 
 "X UUUUUUUUUU RRRRRRRRR OOOOOOOOOO M", 
 "X VVVVVVVVVV SSSSSSSSS PPPPPPPPPP M" 
 }; 

 private static String[] SEAT_SECTIONS = { 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3                                 3", 
 "33   22222222 2222222 22222222   33", 
 "33 2  2222222 2222222 2222222  2 33", 
 "33 22                         22 33", 
 "33 22   1111111111111111111   22 33", 
 "33 22 1  11111111111111111  1 22 33", 
 "44 22 11  111111111111111  11 22 44", 
 "44 22 111 --------------- 111 22 44", 
 "44 22 111|               |111 22 44", 
 "44 22 111|               |111 22 44", 
 "44       |               |       44", 
 "44 22 111|               |111 22 44", 
 "44 22 111|               |111 22 44", 
 "44 22 111 --------------- 111 22 44", 
 "44 22 11  111111111111111  11 22 44", 
 "33 22 1  11111111111111111  1 22 33", 
 "33 22   1111111111111111111   22 33", 
 "33 22                         22 33", 
 "33 2  2222222 2222222 2222222  2 33", 
 "33   22222222 2222222 22222222   33", 
 "3                                 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3", 
 "3 3333333333 333333333 3333333333 3" 
 }; 

 private Seat[][] seats; 

 public Stadium() { 
     seats = new Seat[ROWS][COLUMNS]; 

     for (int r=0; r< ROWS; r++) {  String secString = SEAT_SECTIONS[r]; 
         String rowString = SEAT_ROWS[r]; 
         String numString = SEAT_NUMBERS[r]; 
         for (int c=0; c< COLUMNS; c++) { 
             byte section = (byte)Character.digit(secString.charAt(c),10); 
             char row = (char)rowString.charAt(c); 
             byte number = (byte)Character.digit(numString.charAt(c),10); 
             if (!Character.isLetter(row)) 
                seats[r][c] = null; 
             else 
                seats[r][c] = new Seat(section, row, number); 
         } 
     } 
 } 

 public Seat[][] getSeats() { return seats; } 
 public Seat getSeat(int row, int col) { return seats[row][col]; }


}

Файл Seat.java

package com.example.seats;

public class Seat {
byte section;
char row;
byte number;

public Seat(byte section, char row, byte number) {
    this.section = section;
    this.row = row;
    this.number = number;
}

public int getSection() {
    return section;
}
}

Файл StadiumPanel.java

package com.example.seats;

import java.awt.*;
import javax.swing.*;

public class StadiumPanel extends JPanel {
private Stadium model;

public Seat[][] seatButtons = new Seat[27][35];

public StadiumPanel(Stadium m) {
    model = m;

    Seat[][] seatButtons = model.getSeats();

    setLayout(new GridLayout(27, 35));
    setBackground(Color.WHITE);

    for (int row = 0; row < 27; row++) {
        for (int col = 0; col < 35; col++) {
            if (seatButtons[row][col] != null) {
                if (seatButtons[row][col].getSection() == 1) {
                    JButton b = new JButton();
                    b.setBackground(Color.RED);
                    add(b);
                } else if (seatButtons[row][col].getSection() == 2) {
                    JButton b = new JButton();
                    b.setBackground(Color.GREEN);
                    add(b);
                } else if (seatButtons[row][col].getSection() == 3) {
                    JButton b = new JButton();
                    b.setBackground(Color.BLUE);
                    add(b);
                } else if (seatButtons[row][col].getSection() == 4) {
                    JButton b = new JButton();
                    b.setBackground(Color.YELLOW);
                    add(b);
                }

            } else if (seatButtons[row][col] == null) {
                JLabel b = new JLabel();
                b.setBackground(Color.WHITE);
                add(b);
            }
        }
    }
}

public static void main(String args[]) {
    JFrame f = new JFrame("Stadium Panel Test");
    f.getContentPane().add(new StadiumPanel(new Stadium()));
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(649, 500);
    f.setVisible(true);
}
}

Чтобы быстро выяснить, где в ваших данных у вас есть проблемы

использование

  for (int c=0; c< secString .length(); c++) { 

или сначала проверьте длину этой строки.

  if (secString.length() != COLUMNS) {
     System.out.println ("error with row " + r);
  }

У меня была похожая проблема, просто убедитесь, что ваш класс на стадионе хорошо выровнен. точно так же, как это выглядит в задании. ох и вынь это

 public Seat[][] seatButtons = new Seat[27][35]

и изменить на

  public Seat[][] seatButtons = new Seat[][]

не было необходимости говорить, что это вызывает путаницу

Другие вопросы по тегам