traducir significa que index java substring indexoutofboundsexception

significa - Subcadena de Java: ''índice de cadena fuera de rango''



string index out of range-1 (11)

Estoy adivinando que estoy recibiendo este error porque la cadena está tratando de subcadenar un valor null . Pero, ¿la parte ".length() > 0" eliminaría ese problema?

Aquí está el fragmento de Java:

if (itemdescription.length() > 0) { pstmt2.setString(3, itemdescription.substring(0,38)); } else { pstmt2.setString(3, "_"); }

Tengo este error

java.lang.StringIndexOutOfBoundsException: String index out of range: 38 at java.lang.String.substring(Unknown Source) at MASInsert2.itemimport(MASInsert2.java:192) at MASInsert2.processRequest(MASInsert2.java:125) at MASInsert2.doGet(MASInsert2.java:219) at javax.servlet.http.HttpServlet.service(HttpServlet.java:627) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:835) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286) at java.lang.Thread.run(Unknown Source)


Supongo que estoy recibiendo este error porque la cadena está intentando subscribir un valor Nulo. ¿Pero la parte ".length ()> 0" elimina ese problema?

No, llamar a itemdescription.length () cuando itemdescription es nulo no generaría una StringIndexOutOfBoundsException, sino más bien una NullPointerException ya que esencialmente estaría intentando llamar a un método en nulo .

Como han indicado otros, StringIndexOutOfBoundsException indica que la descripción del elemento no tiene al menos 38 caracteres de longitud. Probablemente quiera manejar ambas condiciones (suponiendo que desea truncar):

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);

Podría ser un buen lugar para una función de utilidad si lo hace mucho ...


Debe comprobar la longitud de la cadena. Usted asume que puede hacer la substring(0,38) siempre que la cadena no sea null , pero en realidad necesita que la cadena tenga al menos 38 caracteres de longitud.


El método de la substring de Java falla cuando intenta obtener una subcadena que comienza en un índice que es más largo que la cadena.

Una alternativa fácil es usar Apache Commons StringUtils.substring :

public static String substring(String str, int start) Gets a substring from the specified String avoiding exceptions. A negative start position can be used to start n characters from the end of the String. A null String will return null. An empty ("") String will return "". StringUtils.substring(null, *) = null StringUtils.substring("", *) = "" StringUtils.substring("abc", 0) = "abc" StringUtils.substring("abc", 2) = "c" StringUtils.substring("abc", 4) = "" StringUtils.substring("abc", -2) = "bc" StringUtils.substring("abc", -4) = "abc" Parameters: str - the String to get the substring from, may be null start - the position to start from, negative means count back from the end of the String by this many characters Returns: substring from start position, null if null String input

Tenga en cuenta que si no puede usar la biblioteca de Apache Commons por algún motivo, puede simplemente obtener las partes que necesita de la fuente.

// Substring //----------------------------------------------------------------------- /** * <p>Gets a substring from the specified String avoiding exceptions.</p> * * <p>A negative start position can be used to start {@code n} * characters from the end of the String.</p> * * <p>A {@code null} String will return {@code null}. * An empty ("") String will return "".</p> * * <pre> * StringUtils.substring(null, *) = null * StringUtils.substring("", *) = "" * StringUtils.substring("abc", 0) = "abc" * StringUtils.substring("abc", 2) = "c" * StringUtils.substring("abc", 4) = "" * StringUtils.substring("abc", -2) = "bc" * StringUtils.substring("abc", -4) = "abc" * </pre> * * @param str the String to get the substring from, may be null * @param start the position to start from, negative means * count back from the end of the String by this many characters * @return substring from start position, {@code null} if null String input */ public static String substring(final String str, int start) { if (str == null) { return null; } // handle negatives, which means last n characters if (start < 0) { start = str.length() + start; // remember start is negative } if (start < 0) { start = 0; } if (start > str.length()) { return EMPTY; } return str.substring(start); }


Es una pena que la substring no se implemente de una manera que maneje cadenas cortas, como en otros lenguajes, por ejemplo, Python.

Ok, no podemos cambiar eso y tenemos que considerar este caso límite cada vez que usamos substr , en lugar de las cláusulas if-else, iría por esta variante más corta:

myText.substring(0, Math.min(6, myText.length()))


Obtienes esto si itemdescription tiene menos de 38 caracteres

Puede ver qué excepciones se lanzan y cuando esté en la API de JAVA en su caso para String # substring (int, int): https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#substring-int-int-

substring public String substring(int beginIndex, int endIndex) . . . Throws: IndexOutOfBoundsException if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex. (same applies to previous java versions as well)


Realmente necesitas verificar si la longitud de la cuerda es mayor o igual a 38.


Supongo que su columna tiene 38 caracteres de longitud, por lo que desea truncar la itemdescription para que quepa dentro de la base de datos. Una función de utilidad como la siguiente debería hacer lo que quieras:

/** * 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())); }

entonces solo lo llamas asi

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


Yo recomendaría apache commons lang . Un one-liner se encarga del problema.

pstmt2.setString(3, StringUtils.defaultIfEmpty( StringUtils.subString(itemdescription,0, 38), "_"));


itemdescription es más corto que 38 caracteres. Es por eso que se está StringOutOfBoundsException la StringOutOfBoundsException .

La comprobación de .length() > 0 simplemente se asegura de que la String tenga algún valor no nulo, lo que debe hacer es verificar que la longitud sea lo suficientemente larga. Tu podrías intentar:

if(itemdescription.length() > 38) ...


substring(0,38) significa que la cadena debe tener 38 caracteres o más. Si no, el "Índice de cadena está fuera de rango".


if (itemdescription != null && itemdescription.length() > 0) { pstmt2.setString(3, itemdescription.substring(0, Math.min(itemdescription.length(), 38))); } else { pstmt2.setString(3, "_"); }