Подстрока Java: «строковый индекс вне диапазона» - PullRequest
18 голосов
/ 05 июня 2009

Я предполагаю, что получаю эту ошибку, потому что строка пытается подставить значение null. Но не устранит ли проблема ".length() > 0" эту проблему?

Вот фрагмент кода Java:

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

Я получил эту ошибку:

 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)

Ответы [ 12 ]

0 голосов
/ 13 июня 2018

Вы получите это, если описание предмета короче 38 символов

Вы можете посмотреть, какие исключения генерируются и когда в API JAVA в вашем случае для String # substring (int, int): https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#substring-int-int-

<b>substring</b>
<i>public String substring(int beginIndex, int endIndex)</i>
   . . .

<b>Throws:</b>
 <i>IndexOutOfBoundsException</i>
 if the beginIndex is negative,
 or <i>endIndex is larger than the length of this String object</i>, 
 or beginIndex is larger than endIndex.



(same applies to previous java versions as well)
0 голосов
/ 17 августа 2016

Вы должны проверить длину строки. Вы предполагаете, что можете сделать substring(0,38), если строка не null, но вам нужно, чтобы длина строки была не менее 38 символов.

...