Sous-chaîne Java: 'index de chaîne hors de portée'
Je devine que je reçois ce message d'erreur parce que la chaîne est en essayant de sous-chaîne d'une null
valeur. Mais ne serait pas le ".length() > 0"
partie à éliminer ce problème?
Voici le fragment de code Java:
if (itemdescription.length() > 0) {
pstmt2.setString(3, itemdescription.substring(0,38));
}
else {
pstmt2.setString(3, "_");
}
J'ai eu cette erreur:
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)
source d'informationauteur phill | 2009-06-04
Vous devez vous connecter pour publier un commentaire.
Non, l'appel itemdescription.longueur() lorsque itemdescription est null ne serait pas générer un StringIndexOutOfBoundsException, mais plutôt d'une NullPointerException puisque vous serait essentiellement d'essayer d'appeler une méthode sur null.
Comme d'autres l'ont indiqué, StringIndexOutOfBoundsException indique que itemdescription n'est pas moins de 38 caractères de long. Vous voulez sans doute de gérer les deux conditions (I en supposant que vous souhaitez tronquer):
Pourrait être un bon endroit pour une fonction d'utilité si vous n'avez que beaucoup de choses...
Il est dommage que
substring
n'est pas mis en œuvre d'une manière qui gère les chaînes courtes – comme dans d'autres langues, par exemple en Python.Ok, nous ne pouvons pas changer cela et d'envisager ce cas de bord chaque fois que nous utilisons
substr
au lieu de if-else clauses j'irais pour cette courte variante:Vous avez vraiment besoin de vérifier si la longueur de la chaîne est plus grande ou égale à 38.
Je recommanderais apache commons lang. Un one-liner prend en charge le problème.
substring(0,38)
signifie que la Chaîne doit être de 38 caractères ou plus. Si non, le "String index out of range".Je suis en supposant que votre colonne est de 38 caractères, de sorte que vous voulez tronquer
itemdescription
à s'insérer dans la base de données. Une fonction d'utilité comme suit devrait faire ce que vous voulez:ensuite il suffit juste de l'appeler comme ceci:
itemdescription
est inférieure à 38 caractères. C'est pourquoi laStringOutOfBoundsException
est en cours de levée.Vérification
.length() > 0
simplement fait en sorte que l'String
a quelques pas de valeur null, ce que vous devez faire est de vérifier que la durée est assez longue. Vous pourriez essayer:De Java
substring
méthode échoue lorsque vous essayez d'obtenir une sous-chaîne commençant à un indice qui est plus longue que la chaîne.Une solution simple est d'utiliser Apache Commons
StringUtils.sous-chaîne
:Vous devez vérifier la longueur de la Chaîne. Vous supposez que vous pouvez faire
substring(0,38)
tant que la Chaîne n'est pasnull
mais vous avez réellement besoin de la Chaîne d'au moins 38 caractères de longueur.Vous obtenez ce si itemdescription est inférieure à 38 caractères
Vous pouvez regarder qui des exceptions sont levées, et lorsque dans l'API JAVA
dans votre cas pour une Chaîne#substring(int,int): https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#substring-int-int-