2015-06-16 2 views
1

У меня есть что-то вроде:Как избежать исключения StringIndexOutOfBoundsException, если подстрока не находится в моей исходной строке?

String idCodice = cessionarioCommittente.substring(
    cessionarioCommittente.indexOf("<IdCodice>") + 10, 
    cessionarioCommittente.indexOf("</IdCodice>")); 

используется для извлечения значения внутри тега XML-документа, представленного содержимого переменной cessionarioCommittente String.

Проблема в том, что тег <IdCodice> может отсутствовать в строке cessionarioCommittente.

Так что в этом случае я получаю это исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -10 
    at java.lang.String.substring(String.java:1937) 
    at it.sistinf.ediwea.fepa.LoadFatturePa.run(LoadFatturePa.java:103) 
    at it.sistinf.ediwea.fepa.TestLoadFatturePa.main(TestLoadFatturePa.java:18) 

Как я могу решить эту проблему? Например, проверяя, существует ли это значение в строке?

+3

Для этого вы должны использовать синтаксический анализатор XML. – Jens

ответ

4

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

String idCodice = null; 
int startTag = cessionarioCommittente.indexOf("<IdCodice>"); 
int endTag = cessionarioCommittente.indexOf("</IdCodice>"); 
if (startTag >= 0 && endTag > startTag) { 
    idCodice = cessionarioCommittente.substring(startTag + 10, endTag); 
} 

Сохраняя индексы в переменных, избежать их поиска в два раза.

2

String.indexOf() возвращает -1, если строка не была найдена. Проверьте, чтобы возвращаемое значение было> = 0, прежде чем что-то делать с ним.

1

Вы можете сделать, как было предложено Эран, или вы можете использовать метод contains и оператор в тройная:

idCodice = (cessionarioCommittente.contains("<IdCodice>") &&cessionarioCommittente.contains("</IdCodice>")) ? cessionarioCommittente.substring(cessionarioCommittente.indexOf("<IdCodice>") + 10, cessionarioCommittente.indexOf("</IdCodice>")):null; 
0

перед выполнением строки подменю вы можете использовать что-то вроде:

String idCodice; 
if(cessionarioCommittente.indexOf("<IdCodice>") > -1){ 
idCodice = cessionarioCommittente.substring(cessionarioCommittente.indexOf("<IdCodice>") + 10, cessionarioCommittente.indexOf("</IdCodice>")); 
} 

Будьте внимательны при проблемах с производительностью при поиске в строке с использованием метода indexOf или contains (метод note: contains() внутренне использует indexOf()). , но мой вопрос в том, почему вы вручную разбираете xml, есть много библиотек, которые делают это эффективно. here! является очень простым примером.

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