Java String: ‚string Index außerhalb des Bereichs‘
-
11-09-2019 - |
Frage
Ich vermute, ich diesen Fehler, da die Zeichenfolge ein null
Wert zu String versucht. Aber wäre nicht das ".length() > 0"
Teil dieses Problem beseitigen?
Hier wird die Java-Snippet:
if (itemdescription.length() > 0) {
pstmt2.setString(3, itemdescription.substring(0,38));
}
else {
pstmt2.setString(3, "_");
}
Ich habe diesen Fehler:
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)
Lösung
I "vermute ich erhalte diesen Fehler da die Zeichenfolge versucht, einen Nullwert String. Aber würde nicht der“.length ()> 0" Teil zu eliminieren diese Frage?
Nein, rufen itemdescription.length (), wenn ItemDescription null ist, würde eine StringIndexOutOfBoundsException nicht erzeugen, sondern eine Nullpointer da Sie im Wesentlichen eine Methode auf null nennen würde versuchen.
Wie andere schon angedeutet haben, zeigt an, dass StringIndexOutOfBoundsException ItemDescription nicht mindestens 38 Zeichen lang ist. Sie wollen wahrscheinlich beiden Bedingungen behandeln (ich vorausgesetzt, Sie kürzen wollen):
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);
Könnte einen guten Ort für eine Nutzenfunktion, wenn Sie, dass eine Menge zu tun ...
Andere Tipps
Es ist schade, dass substring
nicht in einer Art und Weise durchgeführt wird, die kurzen Strings Griffe - wie in anderen Sprachen z.B. Python.
Ok, wir können das nicht ändern und diese Kante Fall jedes Mal, wenn wir substr
verwenden, statt if-else-Klauseln haben zu prüfen, die ich für diese kürzere Variante gehen würde:
myText.substring(0, Math.min(6, myText.length()))
Sie müssen wirklich überprüfen, ob die Länge der Zeichenfolge größer oder gleich 38.
würde ich Apache commons lang empfehlen. Ein Einzeiler kümmert sich um das Problem.
pstmt2.setString(3, StringUtils.defaultIfEmpty(
StringUtils.subString(itemdescription,0, 38), "_"));
substring(0,38)
bedeutet, dass der String hat 38 Zeichen oder mehr sein. Wenn nicht, "ist String-Index außerhalb des Bereichs" die.
if (itemdescription != null && itemdescription.length() > 0) {
pstmt2.setString(3, itemdescription.substring(0, Math.min(itemdescription.length(), 38)));
} else {
pstmt2.setString(3, "_");
}
Ich gehe davon aus Ihrer Spalte 38 Zeichen lang sein, so dass Sie auf wollen truncate itemdescription
innerhalb der Datenbank passen. Eine Nutzenfunktion wie die folgenden sollten tun, was Sie wollen:
/**
* Truncates s to fit within len. If s is null, null is returned.
**/
public String truncate(String s, int len) {
if (s == null) return null;
return s.substring(0, Math.min(len, s.length()));
}
dann rufen Sie einfach es etwa so:
String value = "_";
if (itemdescription != null && itemdescription.length() > 0) {
value = truncate(itemdescription, 38);
}
pstmt2.setString(3, value);
Java substring
Methode schlägt fehl, wenn Sie versuchen, eine Teilkette bei einem Index beginnen, die länger als die Zeichenfolge ist.
Eine einfache Alternative ist Apache Commons StringUtils.substring
:
public static String substring(String str, int start)
Gets a substring from the specified String avoiding exceptions.
A negative start position can be used to start n characters from the end of the String.
A null String will return null. An empty ("") String will return "".
StringUtils.substring(null, *) = null
StringUtils.substring("", *) = ""
StringUtils.substring("abc", 0) = "abc"
StringUtils.substring("abc", 2) = "c"
StringUtils.substring("abc", 4) = ""
StringUtils.substring("abc", -2) = "bc"
StringUtils.substring("abc", -4) = "abc"
Parameters:
str - the String to get the substring from, may be null
start - the position to start from, negative means count back from the end of the String by this many characters
Returns:
substring from start position, null if null String input
Beachten Sie, wenn Sie nicht Apache Commons lib aus irgendeinem Grund verwenden, könnten Sie nur greifen die Teile, die Sie von der Quelle müssen
// Substring
//-----------------------------------------------------------------------
/**
* <p>Gets a substring from the specified String avoiding exceptions.</p>
*
* <p>A negative start position can be used to start {@code n}
* characters from the end of the String.</p>
*
* <p>A {@code null} String will return {@code null}.
* An empty ("") String will return "".</p>
*
* <pre>
* StringUtils.substring(null, *) = null
* StringUtils.substring("", *) = ""
* StringUtils.substring("abc", 0) = "abc"
* StringUtils.substring("abc", 2) = "c"
* StringUtils.substring("abc", 4) = ""
* StringUtils.substring("abc", -2) = "bc"
* StringUtils.substring("abc", -4) = "abc"
* </pre>
*
* @param str the String to get the substring from, may be null
* @param start the position to start from, negative means
* count back from the end of the String by this many characters
* @return substring from start position, {@code null} if null String input
*/
public static String substring(final String str, int start) {
if (str == null) {
return null;
}
// handle negatives, which means last n characters
if (start < 0) {
start = str.length() + start; // remember start is negative
}
if (start < 0) {
start = 0;
}
if (start > str.length()) {
return EMPTY;
}
return str.substring(start);
}
itemdescription
kürzer als 38 Zeichen. Weshalb die StringOutOfBoundsException
geworfen wird.
Überprüfen .length() > 0
macht einfach sicher, dass der String
hat einig nicht-Null-Wert, was Sie tun müssen, ist zu überprüfen, dass die Länge lang genug ist. Sie könnten versuchen:
if(itemdescription.length() > 38)
...
Sie müssen die Stringlänge überprüfen. Sie gehen davon aus, dass Sie substring(0,38)
tun können, solange String nicht null
ist, aber man braucht eigentlich den String von mindestens 38 Zeichen lang zu sein.
Wenn dies angemessen ist, verwende ich paßt anstelle von Teilzeichenfolge .
Mit Teilzeichenfolge :
if( myString.substring(1,17).equals("Someting I expect") ) {
// Do stuff
}
// Does NOT work if myString is too short
Mit paßt (muss Regex-Notation):
if( myString.matches("Someting I expect.*") ) {
// Do stuff
}
// This works with all strings
Sie erhalten diese, wenn ItemDescription kürzer als 38 Zeichen ist
können Sie sehen, welche Ausnahmen geworfen werden und wenn in dem JAVA-API in Ihnen Fall für String # substring (int, int): https://docs.oracle.com/javase/9/docs/api/java/lang/String.html#substring-int-int-
substring public String substring(int beginIndex, int endIndex) . . . Throws: IndexOutOfBoundsException if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex. (same applies to previous java versions as well)