¿Cómo llego a los primeros n
caracteres de una cadena en Java sin hacer primero una verificación de tamaño (en línea es aceptable) o arriesgar un IndexOutOfBoundsException
?
java
string
indexoutofboundsexception
antony.trupe
fuente
fuente
Respuestas:
Aquí hay una solución ordenada:
Opinión: si bien esta solución es "ordenada", creo que en realidad es menos legible que una solución que usa
if
/else
de la manera obvia. Si el lector no ha visto este truco, tiene que pensar más para entender el código. OMI, el significado del código es más obvio en la versiónif
/else
. Para una solución más limpia / más legible, vea la respuesta de @ paxdiablo.fuente
No reinventes la rueda ...:
Javadoc dice:
Así:
fuente
StringUtils.substring(yourString, 0, n)
no es lo mismo queyourString.substring(0, n)
. El primero es deStringUtils
, mientras que el segundo está usandoString.substring
(lo que da una excepción si el índice final excede la longitud de la cadena).if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
no es len, es el índice final.Apache Commons Lang tiene un
StringUtils.left
método para esto.fuente
Hay una clase de pregunta sobre SO que a veces tiene menos sentido, esta está peligrosamente cerca :-)
Quizás podría explicar su aversión a usar uno de los dos métodos que descartó.
Si es solo porque no quiere sazonar su código con
if
declaraciones o códigos de captura de excepciones, una solución es usar una función auxiliar que se encargará de usted, algo como:que verificará las longitudes de antemano y actuará en consecuencia (ya sea devolver una cadena más pequeña o rellenar con espacios).
Entonces no tiene que preocuparse por eso en su código, simplemente llame:
en vez de:
Esto funcionaría en el caso de que parezca estar preocupado (en base a sus comentarios a otras respuestas), no interrumpir el flujo del código al hacer muchas cosas de construcción de cadenas.
fuente
Horrible si
n
es una variable (por lo que debe construir la cadena de formato), pero bastante claro si es una constante:docs
fuente
Utilice el método de subcadena, de la siguiente manera:
Si n es mayor que la longitud de la cadena, esto generará una excepción, como ha señalado un comentarista. Una solución simple es envolver todo esto en la condición
if(s.length()<n)
de suelse
cláusula, puede elegir si solo desea imprimir / devolver toda la Cadena o manejarla de otra manera.fuente
Si tienes la suerte de desarrollarte con Kotlin,
puedes usarlo
take
para lograr tu objetivo.fuente
ApacheCommons me sorprendió,
StringUtils.abbreviate(String str, int maxWidth)
agrega "..." no hay opción para cambiar postfix.WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
mira hacia el siguiente espacio vacío.Solo voy a dejar esto aquí:
fuente
Kotlin: (si alguien lo necesita)
fuente