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

}

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


person user3377222    schedule 11.03.2014    source источник
comment
Я просто добавил стрелки к строкам, которые выдают мне ошибки   -  person user3377222    schedule 11.03.2014
comment
Можете ли вы опубликовать свой класс Seat?   -  person ErstwhileIII    schedule 11.03.2014


Ответы (5)


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

person Dawood ibn Kareem    schedule 11.03.2014

Ваша первая проблема в строке 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 соответствуют действительности, и принять соответствующие меры, если они не соответствуют.

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

person MadProgrammer    schedule 11.03.2014
comment
почему тогда ошибка говорит String index out of range: 17? - person Scary Wombat; 11.03.2014
comment
@user2310289 user2310289 Я могу только предположить, что есть разница между тем, что вы опубликовали, и тем, что работает, потому что я всегда получаю Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 27 - это может быть преобразование между тем, что у вас есть в вашем редакторе, тем, как оно сохраняется в SO и тем, как оно копируется в мое ... - person MadProgrammer; 11.03.2014
comment
Извините за путаницу, но я не ОП, просто любопытный, но анонимный пользователь. - person Scary Wombat; 11.03.2014
comment
@user2310289 user2310289 Извините за поспешные выводы;) - person MadProgrammer; 11.03.2014

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

Файл 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);
}
}
person ErstwhileIII    schedule 11.03.2014

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

использовать

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

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

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

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

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

и изменить на

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

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

person user3299336    schedule 11.03.2014