Подстрока Java: 'индекс строк из диапазона'

Я не смог получить принятый ответ для работы, используя графический интерфейс Netbeans IDE «Create Table», и я нахожусь на Netbeans 8.2. Чтобы заставить его работать, создайте столбец id со следующими параметрами, например

.

enter image description here

и затем использовать опцию «Новые классы сущностей из базы данных», чтобы сгенерировать сущность для таблицы (я создал простую таблицу PERSON с идентификатором столбец, созданный точно так же, как указано выше, и столбец NAME, который является простым столбцом varchar (255). Эти сгенерированные сущности оставляют пользователю возможность добавлять автоматически сгенерированный механизм идентификатора.

GENERATION.AUTO, похоже, пытается использовать последовательности, которые, похоже, не нравятся Derby (ошибка, из-за которой не удалось сгенерировать последовательность / последовательность не существует), поэтому GENERATION.SEQUENCE также не работает, GENERATION.IDENTITY - нет. работать (получить ошибку с указанием идентификатора null), так что оставляет GENERATION.TABLE.

Установите кнопку «Стратегия создания таблиц» на вашем постоянном устройстве на «Создать». Это создаст таблицы, которые не существуют в БД, когда ваш jar запущен (загружен?), Т.е. таблица, которую должен создать ваш PU для хранения приращений идентификатора. В вашей сущности замените сгенерированные аннотации над вашим полем id следующим ...

enter image description here

Я также создал контроллер для своего класса сущностей, используя опцию «Классы контроллеров JPA из классов сущностей». Затем я создаю простой основной класс для проверки того, что идентификатор был сгенерирован автоматически, т.е.

enter image description here

В результате PERSON_ID_TABLE сгенерирован правильно, и в моей таблице PERSON есть две записи PERSON с правильными автоматически сгенерированными идентификаторами.

20
задан Peter Mortensen 8 February 2018 в 20:20
поделиться

7 ответов

Полагаю, я получаю эту ошибку потому что строка пытается substring значение Null. Но не стал бы часть ".length ()> 0" исключает эта проблема?

Нет, вызов itemdescription.length (), когда itemdescription имеет значение null, не вызовет исключение StringIndexOutOfBoundsException, а скорее исключение NullPointerException, поскольку вы, по сути, пытаетесь вызвать метод на null .

Как указывали другие, StringIndexOutOfBoundsException указывает, что описание элемента не содержит по крайней мере 38 символов. Вероятно, вы захотите обработать оба условия (я предполагаю, что вы хотите усечь):

final String value;
if (itemdescription == null || itemdescription.length() <= 0) {
    value = "_";
} else if (itemdescription.length() <= 38) {
    value = itemdescription;
} else { 
    value = itemdescription.substring(0, 38);
}
pstmt2.setString(3, value);

Может быть хорошим местом для служебной функции, если вы будете делать это много ...

33
ответ дан 29 November 2019 в 22:29
поделиться

Вам действительно нужно проверить, не превышает ли длина строки 38.

9
ответ дан 29 November 2019 в 22:29
поделиться

Я бы порекомендовал apache commons lang . Однострочник решает проблему.

pstmt2.setString(3, StringUtils.defaultIfEmpty(
    StringUtils.subString(itemdescription,0, 38), "_")); 
7
ответ дан 29 November 2019 в 22:29
поделиться
if (itemdescription != null && itemdescription.length() > 0) {
    pstmt2.setString(3, itemdescription.substring(0, Math.min(itemdescription.length(), 38))); 
} else { 
    pstmt2.setString(3, "_"); 
}
5
ответ дан 29 November 2019 в 22:29
поделиться

подстрока (0,38) означает, что строка должна содержать 38 символов или больше. В противном случае «индекс строки вне допустимого диапазона».

5
ответ дан 29 November 2019 в 22:29
поделиться

описание элемента короче 38 символов. Вот почему возникает исключение StringOutOfBoundsException .

Проверка .length ()> 0 просто гарантирует, что строка String имеет ненулевое значение, что вам нужно сделать, это проверить, что длина достаточно велика. Вы можете попробовать:

if(itemdescription.length() > 38)
  ...
1
ответ дан 29 November 2019 в 22:29
поделиться

Я предполагаю, что длина вашего столбца составляет 38 символов, поэтому вы хотите усечь описание элемента , чтобы оно поместилось в базе данных. Служебная функция, подобная следующей, должна делать то, что вы хотите:

/**
 * Truncates s to fit within len. If s is null, null is returned.
 **/
public String truncate(String s, int len) { 
  if (s == null) return null;
  return s.substring(0, Math.min(len, s.length()));
}

, тогда вы просто называете ее так:

String value = "_";
if (itemdescription != null && itemdescription.length() > 0) {
  value = truncate(itemdescription, 38);
}

pstmt2.setString(3, value);
2
ответ дан 29 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: