2009-06-04 19 views
14

मुझे लगता है कि मुझे यह त्रुटि मिल रही है क्योंकि स्ट्रिंग null मान को प्रतिस्थापित करने का प्रयास कर रही है। लेकिन ".length() > 0" भाग उस मुद्दे को खत्म नहीं करेगा?जावा सबस्ट्रिंग: 'स्ट्रिंग इंडेक्स ऑफ रेंज'

यहाँ जावा छोटा सा अंश है:

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) 

उत्तर

28

I"m guessing i'm getting this error because the string is trying to substring a Null value. But wouldn't the ".length() > 0" part eliminate that issue?

नहीं है, itemdescription.length) बुला (जब itemdescription रिक्त है एक StringIndexOutOfBoundsException उत्पन्न नहीं होता है, बल्कि आप के बाद से एक NullPointerException अनिवार्य पर एक विधि कॉल करने की कोशिश कर की जाएगी शून्य

जैसा कि अन्य ने संकेत दिया है, स्ट्रिंग इंडेक्सऑटऑफबाउंड्स एक्सेप्शन इंगित करता है कि आइटम डिस्क्रिप्शन कम से कम 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); 

एक उपयोगिता समारोह के लिए एक अच्छी जगह हो सकती है आपको लगता है कि एक बहुत ...

9

आप वास्तव में अगर स्ट्रिंग की लंबाई के लिए अधिक से अधिक या 38.

4

के बराबर है जांच करने की आवश्यकता substring(0,38) का मतलब है कि स्ट्रिंग 38 वर्ण या उससे अधिक होनी चाहिए। यदि नहीं, तो "स्ट्रिंग इंडेक्स सीमा से बाहर है"।

1

itemdescription 38 वर्णों से छोटा है। यही कारण है कि StringOutOfBoundsException फेंक दिया जा रहा है।

.length() > 0 की जांच करना सुनिश्चित करता है कि String में कुछ शून्य-शून्य मूल्य नहीं है, आपको यह करने की आवश्यकता है कि लंबाई काफी लंबी है। आप की कोशिश कर सकते:

if(itemdescription.length() > 38) 
    ... 
4
if (itemdescription != null && itemdescription.length() > 0) { 
    pstmt2.setString(3, itemdescription.substring(0, Math.min(itemdescription.length(), 38))); 
} else { 
    pstmt2.setString(3, "_"); 
} 
+2

मुझे यह जानने में वास्तव में दिलचस्पी होगी कि itemdescription.substring (0, itemdescription.length()) वापस आ जाएगा :) – pugmarx

+0

var itemdescription = new स्ट्रिंग ("हैलो, वर्ल्ड!"); अलर्ट (itemdescription.substring (0, itemdescription.length)); "हैलो, वर्ल्ड!" लौटाता है। – tom

+0

वह शायद इसके साथ * कुछ * करना चाहता था। –

2

मैं अपने संभालने कर रहा हूँ कर कॉलम लंबाई में 38 वर्ण है, इसलिए आप डेटाबेस में फिट होने के लिए ट्रंकेटitemdescription करना चाहते हैं। निम्नलिखित की तरह एक उपयोगिता समारोह आप क्या चाहते हैं करना चाहिए:

/** 
* 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())); 
} 

तो आप सिर्फ यह इतना की तरह फोन:

String value = "_"; 
if (itemdescription != null && itemdescription.length() > 0) { 
    value = truncate(itemdescription, 38); 
} 

pstmt2.setString(3, value); 
5

मैं apache commons lang की सिफारिश करेंगे। एक लाइनर समस्या का ख्याल रखता है। जैसे अन्य भाषाओं में तरह -

pstmt2.setString(3, StringUtils.defaultIfEmpty(
    StringUtils.subString(itemdescription,0, 38), "_")); 
13

यह एक दया है कि substring एक तरीका है कि छोटी स्ट्रिंग संभालती में लागू नहीं किया गया है अजगर।

ठीक है, हम चाहते हैं कि नहीं बदल सकते हैं और इस बढ़त मामले हर बार जब हम substr का उपयोग पर विचार करना है, के बजाय अगर-बाकी खंड मैं इस छोटे संस्करण के लिए जाना होगा:

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

जावा के substring पद्धति असफल हो जाती है जब आप एक इंडेक्स से शुरू होने वाली एक सबस्ट्रिंग को आज़माएं और स्ट्रिंग से अधिक लंबा हो।

एक आसान विकल्प 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 
0

आप स्ट्रिंग लंबाई की जांच करनी चाहिए। आप मानते हैं कि आप substring(0,38) कर सकते हैं जब तक स्ट्रिंग null नहीं है, लेकिन आपको वास्तव में स्ट्रिंग को कम से कम 38 वर्णों की लंबाई की आवश्यकता होती है।

संबंधित मुद्दे