2009-06-04 20 views
14

Suppongo di ricevere questo errore perché la stringa sta tentando di applicare una sottostringa a un valore null. Ma la parte ".length() > 0" non eliminerebbe quel problema?Sottostringa Java: "indice di stringa fuori intervallo"

Ecco la Java frammento:

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

ho ottenuto questo errore:

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) 

risposta

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, chiamando itemdescription.length() quando itemdescription è null non genererebbe uno StringIndexOutOfBoundsException, ma piuttosto un NullPointerException in quanto si sarebbe essenzialmente cercando di chiamare un metodo su null.

Come altri hanno indicato, StringIndexOutOfBoundsException indica che la descrizione dell'oggetto non è lunga almeno 38 caratteri. Probabilmente si desidera gestire entrambe le condizioni (I supponendo che si desidera troncare):

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

potrebbe essere un buon posto per una funzione di utilità se si fa che un sacco ...

9

Hai davvero bisogno di controllare se la lunghezza della stringa è maggiore o uguale a 38.

4

substring(0,38) significa che la stringa deve avere una lunghezza massima di 38 caratteri. In caso contrario, "l'indice di stringa non è compreso nell'intervallo".

1

itemdescription è più corto di 38 caratteri. Ecco perché viene lanciato il StringOutOfBoundsException.

Controllare .length() > 0 semplicemente si assicura che il valore String abbia un valore non nullo, quello che devi fare è controllare che la lunghezza sia abbastanza lunga. Si potrebbe provare:

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

Sarei davvero interessato a sapere quale itemdescription.substring (0, itemdescription.length()) restituirebbe :) – pugmarx

+0

var itemdescription = new String ("Hello, World!"); Avviso (itemdescription.substring (0, itemdescription.length)); restituisce "Ciao, mondo!". – tom

+0

Probabilmente voleva fare * qualcosa * con esso. –

2

sto assumendo la tua la colonna ha una lunghezza di 38 caratteri, quindi si desidera troncareitemdescription per adattarsi al database. Una funzione di utilità come la seguente dovrebbe fare quello che vuoi:

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

poi basta chiamano in questo modo:

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

pstmt2.setString(3, value); 
5

mi sento di raccomandare apache commons lang. Un one-liner si prende cura del problema.

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

E 'un peccato che substring non è implementato in un modo che gestisce le stringhe brevi - come ad esempio in altre lingue Pitone.

Ok, non siamo in grado di cambiare la situazione e prendere in considerazione questo caso limite ogni volta che usiamo substr, invece di if-else clausole vorrei andare per questa variante più corta:

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

il metodo di Java substring fallisce quando prova a ottenere una sottostringa a partire da un indice che è più lungo della stringa.

Un facile alternativa è quella di utilizzare 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

È necessario controllare la lunghezza della stringa. Si presuppone che è possibile eseguire substring(0,38) a condizione che String non sia null, ma in realtà è necessario che la stringa abbia una lunghezza di almeno 38 caratteri.

Problemi correlati