Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java substring: 'string index out of range'

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?

Here is the Java snippet:

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

I got this 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) 
like image 742
phill Avatar asked Jun 04 '09 22:06

phill


1 Answers

It is a pity that substring is not implemented in a way that handles short strings – like in other languages e.g. Python.

Ok, we cannot change that and have to consider this edge case every time we use substr, instead of if-else clauses I would go for this shorter variant:

myText.substring(0, Math.min(6, myText.length())) 
like image 64
linqu Avatar answered Sep 26 '22 01:09

linqu