2013-06-26 5 views
0

приведенный ниже код бросает меня StringIndexOfBoundExceptionправильный способ обработки StringIndexOfBoundException

if (custom.getUser().equals("0") || custom.getUser().equals("")) { 
    vital.add(new Pair<String, String>("User", "-")); 
} else { 
    vital.add(new Pair<String, String>("User", custom.user() + "F" + "\n" + custom.getName().subString(0,1)); 
} 

Отображение первого символа строки. Приведенный ниже код работает нормально, но я не уверен, правильно ли он это сделал.

String name = ""; 
if (custom.getUser().equals("0") || custom.getUser().equals("")) { 
    vital.add(new Pair<String, String>("User", "-")); 
} else if (!custom.getName().equals("")) { 
    name = custom.getName().substring(0, 1); 
} else { 
    vital.add(new Pair<String, String>("User", custom.user() + "F" + "\n" + name)); 
} 
+2

Это не похоже на действительный код Java. Можете ли вы показать нам свой фактический код или упрощенную версию, которая компилируется? –

+1

'String' имеет' .isEmpty() '! – fge

+0

Убедитесь, что длина строки() находится в диапазоне, который вы используете в subString. – kosa

ответ

1

Во-первых, откуда вы получаете исключение?

custom.getName().subString(0,1) throws a StringIndexOfBoundException только если custom.getName() пуст. Но если он пуст, код не войдет в ветвь else, поэтому вы не сможете получить исключение.

Во-вторых, второй способ не эквивалентен первому: если custom.getName() не является ни пустым, ни "0" ничего не добавлено в vital.


Я считаю, что это улучшение:

if (custom.getUser().equals("0") || custom.getUser().isEmpty()) { 
    vital.add(new Pair < String, String > ("User", "-")); 
} else { 
    // limit scope of variable to else-branch 
    String name = ""; 
    // check empty string with isEmpty 
    if (!custom.getName().isEmpty()) { 
     name = custom.getName().substring(0, 1); 
    } 
    // add a new Pair in any case 
    vital.add(new Pair < String, String > 
     ("User", custom.user() + "F" + "\n" + name)); 
} 
+0

Простите, пропустили часть, обновили код. – theJava

+0

См. Обновление, @ theJava. – Joni

+0

Я не могу использовать isEmpty(), есть ли альтернатива для того же самого. – theJava

0

Вы только что получили логическую ошибку в первом блоке. Вы можете ввести блок с пустой строкой (custom.getName().equals("")), что означает, что custom.getName().length() == 0. Поэтому, когда вы пытаетесь получить первый символ с substring(0,1), он выбрасывает StringIndexOfBoundException. Просто измените условное на что-то вроде этого:

if (custom.getUser().equals("0") || custom.getName().length() > 0) { 
0

В else if состоянии вам нужно проверить, если строка "custom.getName() длина()> = 2.".