2013-11-24 4 views
1

Так что я вызываю метод makeCard (String info) из другого класса. Он работает нормально при первом запуске, но во второй раз я вызываю метод, который, кажется, запускается дважды, что создает ошибку выполнения StringIndexOutOfBoundsException, и я не могу понять, почему. Я немного новичок в Java, поэтому я могу пропустить что-то очевидное, но логика в моей голове говорит, что он должен запускаться только один раз, если вызван один раз. Надеюсь, кто-то может указать на мою ошибку.Мой метод работает дважды, когда он вызывается только один раз

Вот метод:

public void makeCard(String info){ 
    cInfo = new StringBuffer(info); 
    int i = 0; 

    while(cInfo.charAt(i)== ' '){ 
     cInfo.deleteCharAt(i); 
    } 
    while(cInfo.charAt(cInfo.length()-1)== ' '){ 
     cInfo.deleteCharAt(cInfo.length()-1); 
     i--; 
    } 
    seperateValues(); 
    makeObject(); 
} 

и здесь, где она называется:

@Override 
public void actionPerformed(ActionEvent e) { 
    MainWindow mw = new MainWindow(); 
    CardBreakdown cb = new CardBreakdown(); 
    if("submit".equals(e.getActionCommand())){ 
     cb.makeCard(cardInfo.getText()); 
     mw.removeAddPanel(); 
     cardInfo.setText(""); 
    } 
} 

Заранее спасибо за любую помощь вы можете предоставить

это ошибка: Исключение в потоке «AWT-EventQueue-0» java.lang.StringIndexOutOfBoundsException: Индекс строки за пределами допустимого диапазона: 0

+0

Может ли вы отправить сообщение об ошибке? – FaddishWorm

+0

Исключение в потоке "АВТ-EventQueue-0" java.lang.StringIndexOutOfBoundsException: индекс строки из диапазона: 0 \t в java.lang.StringBuffer.charAt (Unknown Source) \t в CardBreakdown.makeCard (CardBreakdown.java:24) \t в EnterCard.actionPerformed (EnterCard.java:62) \t в javax.swing.AbstractButton.fireActionPerformed (Unknown Source) \t в javax.swing.AbstractButton $ Handler.actionPerformed (Unknown Source) \t в javax.swing .DefaultButtonModel.fireActionPerformed (Неизвестный источник) – mig

+0

Я бы не использовал StringBuffer, никогда. Я бы использовал 'info.trim()', который будет делать то, что вы хотите. –

ответ

0

Ваш код излишне свернут для простого удаления всех вхождений символа пробела из строки. Вместо этого:

cInfo = info.trim(); 
+0

есть другие пробелы в stringbuffer, которые я хочу сохранить, но спасибо за подсказку – mig

+0

Тогда почему первый цикл, который удаляет из него все пробелы? Кроме того, используйте 'StringBuilder' вместо' StringBuffer'. – chrylis

+0

Первый цикл выполняет 'ltrim()', поскольку он останавливается, когда он встречает первое не-пространство. – rsp

3

первый, что я буду делать замену этих двух while петель в makeCard() с простым вызовом String.trim() - эта функция будет удалить начальные и конечные пробелы для вас.

Вы должны, как правило всегда предпочитают вызов библиотеки в разработке собственных функций, особенно функции, которые могут иметь довольно фатальную ошибку, когда, например, обработка пустых строк или строк, которые состоят только из пространств :-)

Нет никакой проверки ни в одном из ваших циклов для случая, когда строка является или становится пустой, что означает, что charAt будет жаловаться горько.

1

Что делать, если информация была пуста или нулевым? Затем cInfo.charAt (0) вернет ошибку, которую вы получаете. Вы должны указать нулевую или пустую проверку в начале вашего метода makeCard.

+0

Пустая проверка разумна, но бросание 'NullPointerException' было бы вполне разумно для ввода «null». – chrylis

Смежные вопросы