Java 子字符串:“字符串索引超出范围”

我猜我收到此错误是因为字符串正在尝试对值进行子字符串。但是,这部分不会消除这个问题吗?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)

答案 1

遗憾的是,它没有以处理短字符串的方式实现 - 就像在其他语言中一样,例如Python。substring

好吧,我们不能改变这一点,并且每次使用时都必须考虑这个边缘情况,而不是if-else子句,我会选择这个较短的变体:substr

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

答案 2

我猜我收到此错误,因为字符串正在尝试对 Null 值进行子字符串。但是,“.length() > 0”部分不会消除这个问题吗?

不,当 itemdescription 为 null 时调用 itemdescription.length() 不会生成 StringIndexOutOfBoundsException,而是生成 NullPointerException,因为您实际上会尝试在 null 上调用一个方法。

正如其他人所指出的,StringIndexOutOfBoundsException 指示 itemdescription 的长度不至少为 38 个字符。您可能希望同时处理这两种情况(我假设您要截断):

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

如果你经常这样做,可能是一个实用工具函数的好地方......


推荐