2014-02-16 4 views
-3
/** 
* Shortens input by only having one letter in the output. 
*If user inputs blank  answer, default is size Small. 
*/ 

if (!burgerSize.isEmpty()) { 
    burgerSize = burgerSize.trim().toUpperCase(); 
    burgerSize = burgerSize.substring(0, 1); 
} 

Когда я сделал это в моем проекте, в командной строке сказал:Обрезка строки перед тем подстроки

Исключение в потоке «главный» java.lang.StringIndexOutOfBoundsException ... Индекс строки из диапазона: 1

в java.lang.String.substring (String.java:1 ...)

на BurgerOrder.main (BurgerOrder.java:66)»

Если я переключаю строки вокруг, это не так ... но мой учитель сказал мне обрезать строку перед подстрокой.

if (!burgerSize.isEmpty()) { 
    burgerSize = burgerSize.substring(0, 1); 
    burgerSize = burgerSize.trim().toUpperCase(); 

} 

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

ОБНОВЛЕНИЕ: Позвольте пояснить. Если пользователь вводит букву S, как это делает "ssss", он сокращает и использует значение «S». То же самое для M, как "mmmmm" и так далее. Я знаю, что делаю с моим кодом. Мне просто интересно, было ли то, что предложил мой профессор, неправильно (он читал мой код, который я распечатывал).

+1

Вы понимаете, что каждый делает? –

+0

Ух, я добавил комментарии в начале. – user3315017

+2

Его вопрос был на самом деле риторическим. Вы получаете эту ошибку по очень веской причине; строка будет пустой после того, как вы обрезаете ее. Если вы читаете javadoc для 'substring', он сообщает вам: IndexOutOfBoundsException - если beginIndex отрицательный или endIndex больше длины этого объекта String –

ответ

1

Метод String isEmpty() проверяет, не содержит ли строка ни одного символа, даже пробела. Например, если burgerSize = " " (обратите внимание на пробел между кавычками), то вызов trim() удалит это пространство, и ваш вызов на substring(0, 1) завершится неудачно, потому что строка пуста, хотя она не была пуста, когда вы ее впервые проверили.

Try переместив trim() быть выше, если заявление, как это:

burgerSize = burgerSize.trim(); 
if (!burgerSize.isEmpty()) 
{ 
    burgerSize = burgerSize.substring(0, 1).toUpperCase(); 
} 
+0

Спасибо! Мой учитель положил свою стрелу в утверждение if, когда он исправлял мою. – user3315017

0

отделка удаляет пробелы, такие как пробелы. Когда burgerSize начинает с пробела, он не пуст в этой точке, поэтому он передает тест isEmpty. Но затем, когда вы обрезаете пространство, burgerSize становится пустым, поэтому попытка получить первое письмо не удалась. Сначала попробуйте обрезать, затем проверьте, не пусто.

Удачи вам!

+0

Спасибо! Коррекция моих учителей, когда он поставил свою стрелу, был в том, что заявление, которое меня смутило. Теперь имеет смысл. – user3315017

0

Чтобы быть в безопасности, вы должны обрезать строку, прежде чем делать подстроки. Рассмотрим:

/** 
    <P>{@code java TrimBeforeSubstrXmpl}</P> 
**/ 
public class TrimBeforeSubstrXmpl { 
    public static final void main(String[] igno_red) { 
     test("sssssssss"); 
     test(" sssssssss"); 
    } 
    private static final void test(String s_s) { 
     System.out.println("Testing \"" + s_s + "\""); 

     s_s = s_s.substring(0, 1); 

     System.out.println(" Substring: \"" + s_s + "\""); 

     s_s = s_s.trim().toUpperCase(); 

     System.out.println(" Trimmed then uppercase: \"" + s_s + "\""); 
    } 
} 

Выход:

[C:\java_code\]java TrimBeforeSubstrXmpl 
Testing "sssssssss" 
    Substring: "s" 
    Trimmed then uppercase: "S" 
Testing " sssssssss" 
    Substring: " " 
    Trimmed then uppercase: "" 
+0

Да, это имеет смысл сейчас, спасибо вам большое. – user3315017

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