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)
War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top