Como faço para obter os primeiros n
caracteres de uma string em Java sem fazer uma verificação de tamanho primeiro (a linha é aceitável) ou arriscar IndexOutOfBoundsException
?
java
string
indexoutofboundsexception
antony.trupe
fonte
fonte
Respostas:
Aqui está uma solução elegante:
Opinião: embora essa solução seja "pura", acho que é realmente menos legível do que uma solução que usa
if
/else
da maneira óbvia. Se o leitor não viu esse truque, ele / ela precisa pensar mais para entender o código. IMO, o significado do código é mais óbvio na versãoif
/else
. Para uma solução mais limpa / legível, consulte a resposta de @ paxdiablo.fonte
Não reinvente a roda ...:
Javadoc diz:
Portanto:
fonte
StringUtils.substring(yourString, 0, n)
não é o mesmo queyourString.substring(0, n)
. O primeiro é deStringUtils
, enquanto o último está usandoString.substring
(o que dá exceção se o índice final exceder o comprimento da string).if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
não é len, é o índice final.O Apache Commons Lang tem um
StringUtils.left
método para isso.fonte
Há uma classe de perguntas sobre SO que às vezes fazem menos do que perfeito sentido; esta é perigosamente próxima :-)
Talvez você possa explicar sua aversão ao uso de um dos dois métodos que descartou.
Se é apenas porque você não deseja incluir seu código em
if
instruções ou códigos de captura de exceção, uma solução é usar uma função auxiliar que cuidará disso para você, algo como:que verificará os comprimentos antecipadamente e agirá de acordo (retorne uma string menor ou use um espaço com espaços).
Então você não precisa se preocupar com isso no seu código, basta ligar para:
ao invés de:
Isso funcionaria no caso em que você pareça estar preocupado (com base nos seus comentários para outras respostas), em não interromper o fluxo do código ao fazer várias coisas de construção de strings.
fonte
Horrível se
n
for uma variável (portanto, você deve construir a sequência de formatação), mas bem claro se for uma constante:docs
fonte
Use o método de substring, da seguinte maneira:
Se n for maior que o comprimento da string, isso gerará uma exceção, como apontou um comentarista. Uma solução simples é agrupar tudo isso na condição
if(s.length()<n)
de suaelse
cláusula, você pode escolher se deseja apenas imprimir / retornar a String inteira ou lidar com ela de outra maneira.fonte
Se você tiver sorte o suficiente para desenvolver com o Kotlin,
poderá usar
take
para atingir seu objetivo.fonte
O ApacheCommons me surpreendeu,
StringUtils.abbreviate(String str, int maxWidth)
acrescenta "...", não há opção para alterar o postfix.WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
procura o próximo espaço vazio.Eu só vou deixar isso aqui:
fonte
Kotlin: (Se alguém precisar)
fonte