1. ホーム
  2. java

[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。

2022-01-23 21:54:10

質問

を部分文字列化しようとしているため、このエラーが発生するのだと思われます。 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)

解決方法は?

<ブロッククオート

このエラーは、次のようなものだと思います。 文字列が Null 値を部分文字列化します。しかし の部分を削除しました。 ということでしょうか?

いいえ、itemdescription が NULL のときに itemdescription.length() を呼び出すと、StringIndexOutOfBoundsException は発生せず、NullPointerException が発生することになります。 ヌル .

他の方が指摘されているように、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);

ユーティリティ関数は、そのようなことをよくするのであれば、良い場所かもしれません...