2016-03-19 4 views
0

Я столкнулся с странным поведением Java во время выполнения. Вся информация находится на снимке экрана. Мое приложение не работает. Удивительно, но с одинаковыми входными данными в разное время можно обрабатывать правильно. Можете ли вы объяснить мне, в чем причина этого странного поведения? Я использую JDK 1.7.0_79 Здесь полную часть кода id = "common.dto.IdsFilter"Странное поведение Java

private String[] splitPackageAndNameParts(String id) { 
    // check string not empty 
    if (StringUtils.isEmpty(id)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // get last point index 
    int index = id.lastIndexOf("."); 

    // check index 
    if (index == 0 || index >= (id.length() - 1)) { 
     throw new IllegalArgumentException("Unexpected id : " + id); 
    } 

    // split 
    String pkgPart = index < 0 ? "" : id.substring(0, index + 1); 
    String namePart = id.substring(index + 1, id.length()); 

    // return result 
    return new String[]{pkgPart, namePart}; 
} 

Правильный результат, должен быть pkgPart = "common.dto.", но во время выполнения он возвращает "common.dto" (без точки)

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

Нам нужен * фактический код * здесь. Мы не можем помочь вам с скриншотом, так как * мы * не можем подключить это к нашим копиям IntelliJ, чтобы узнать, что происходит. – Makoto

+0

Пожалуйста, отредактируйте свой ответ, чтобы уточнить: какие входные данные вы используете, каково ожидаемое поведение и какое сообщение об ошибке вы получите. И разместите код, который у вас есть (нет скриншота, но настоящий Java-код), чтобы мы могли вам помочь. –

ответ

1

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

Простое изменение: удалите + 1 из операции подстроки.

В качестве альтернативы, с Java 8 существует более четкий способ сделать это, используя StringJoiner и String#split. Это даст вам первый элемент; второй элемент - это просто последний из разделяемой коллекции.

String[] split = pkg.split("\\."); 
final StringJoiner stringJoiner = new StringJoiner("."); 
for(int i = 0; i < split.length - 1; i++) { 
    stringJoiner.add(split[i]); 
} 
System.out.println(stringJoiner.toString()); 
+0

Большое спасибо! Но у меня такая же проблема. Я удалил '+ 1' из подстрочных операций, он отлично работает в тестах без каких-либо проблем. Но теперь '.' Пропущено в 'NamePart' во время выполнения. Когда я его оцениваю, он возвращает правильный результат, но во время выполнения он терпит неудачу (та же проблема, что и на скриншоте) – jahra

+0

Я заметил, что первый вызов метода с '" common.dto.IdsFilter "' как вход работает отлично и возвращает правильное значение , Но если я вызову этот метод сразу после первого вызова с помощью того же '' common.dto.IdsFilter '' как вход, он вернет неверный результат – jahra

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