EndIndex меньше длины этой подстроки объекта String

У меня есть строка, как показано ниже

String s = "John21071989Bangalore";

Class Person {
  String name;
  Long dob;
  String city;
  ....
}

У меня есть bean-компонент, разделенная строка и установлены значения Bean.

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(Long.ParseLong(s.subString(4,12))); //2071989
p.setCity(s.subString(12,21));//Bangalore

Теперь моя проблема в том, что если подстрока endIndesx меньше длины, дающей ошибку. Я хочу получить значение dob как нулевую ошибку.

String s1 = "John2107    Bangalore";

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(Long.ParseLong(s.subString(4,12))); //this should be null 
p.setCity(s.subString(12,21));//Bangalore

При чем тут длина? Ошибка из-за пробелов

Parth Mody 27.03.2018 03:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
232
3

Ответы 3

String s = "John21071989Bangalore";

    Pattern pattern = Pattern.compile("(?<name>[a-zA-Z]+)(?<dob>\\d*)\\s*(?<city>[a-zA-Z]+)");
    Matcher m = pattern.matcher(s);
    Person p = new Person();
    if (m.find()) {
        p.setName(m.group("name"));
        String dob = m.group("dob");
        if (dob != null && !dob.trim().isEmpty())
            p.setDob(Long.valueOf(dob.trim()));
        p.setCity(m.group("city"));
    }

Для второго сценария у вас есть:

String s1 = "John2107    Bangalore";

Согласно этой инструкции:

p.setDob(Long.ParseLong(s.subString(4,12))); //this should be null 

Вы пытаетесь преобразовать пробелы в число, поэтому возникнет исключение.

Вы можете проверить эту строку или заключить блок в try-catch:

Может быть, вам поможет что-то вроде этого:

Создайте метод под названием "parseDob":

public Long parseDob(String val) {
   try {
      return Long.ParseLong(val);
   } catch (NumberFormatException e) {
      return null;
    }
}

Тогда вы можете оставить свой код:

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(parseDob(s.subString(4,12)));
p.setCity(s.subString(12,21));//Bangalore

Есть два метода подстроки:

1. подстрока (int beginIndex)

2. подстрока (int beginIndex, int endIndex)

Второй - тот, который вы используете. По сути, он получает подстроку от beginIndex до endIndex.

Пример: «abcdefg» .substring (2,4); // возвращаем 'cd' c - начальный индекс и включен. Однако endIndex 4, который представляет 'e' в этом примере, не включен. Когда вы пытаетесь использовать этот метод для получения подстроки от начального индекса до конца строки, вам нужно ввести конечный индекс, превышающий длину строки, и это создает исключение. Это именно то, что вы делаете.

Вместо использования второго метода используйте первый. Он просто получает подстроку от данного индекса до конца String.

Пример: «abcdefg» .substring (2); // возвращает "cdefg"

В заключение ваш код должен выглядеть следующим образом:

Person p = new Person();
p.setName(s.subString(0,4)); //John
p.setDob(Long.ParseLong(s.subString(4,12))); //2071989
p.setCity(s.subString(12));//Bangalore

Другие вопросы по теме