2009-06-04 25 views
14

Supongo que recibo este error porque la cadena intenta subcadenas de un valor null. Pero, ¿la pieza ".length() > 0" no eliminaría ese problema?Subcadena Java: 'cadena índice fuera de rango'

aquí es de fragmento de código 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) 

Respuesta

28

I"m guessing i'm getting this error because the string is trying to substring a Null value. But wouldn't the ".length() > 0" part eliminate that issue?

No, llamando itemdescription.length() cuando ITEMDESCRIPTION es nulo no generaría una StringIndexOutOfBoundsException, sino más bien una NullPointerException ya que en esencia sería tratar de llamar a un método de null.

Como han indicado otros, StringIndexOutOfBoundsException indica que la descripción del elemento no tiene al menos 38 caracteres de longitud. Es posible que desee manejar tanto las condiciones (I asumiendo que usted 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 ...

9

Usted realmente necesita para comprobar si la longitud de la cadena es mayor que o igual a 38.

4

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

1

itemdescription tiene menos de 38 caracteres. Por eso, el StringOutOfBoundsException está siendo lanzado.

Comprobando .length() > 0 simplemente se asegura de que el String tenga algún valor no nulo, lo que debe hacer es verificar que la longitud sea lo suficientemente larga. Usted podría intentar:

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

Estaría realmente interesado en saber qué itemdescription.substring (0, itemdescription.length()) devolvería :) – pugmarx

+0

var itemdescription = new String ("¡Hola, mundo!"); Alerta (itemdescription.substring (0, itemdescription.length)); devuelve "¡Hola, mundo!". – tom

+0

Probablemente quiso hacer * algo * con eso. –

2

estoy asumiendo que su la columna tiene 38 caracteres de longitud, por lo que desea truncaritemdescription para que quepa en la base de datos. Una función de utilidad como el siguiente debe hacer lo que quiera:

/** 
* 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 sólo lo llaman así:

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

pstmt2.setString(3, value); 
5

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

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

Es una lástima que substring no se implementa de manera que se encarga de cadenas cortas - como en otros idiomas, por ejemplo, Pitón.

Ok, no podemos cambiar eso y tener en cuenta este caso el borde cada vez que utilizamos substr, en lugar de if-else cláusulas Me gustaría ir para esta variante más corta:

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

método de Java substring falla cuando intente obtener una subcadena que comience en un índice que sea más largo que la cadena.

Una alternativa fácil es utilizar 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 
0

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

Cuestiones relacionadas