मुझे पता है कि यह धागा काफी पुराना है लेकिन यह एक मौलिक समस्या है जो मुझे लगता है कि यह स्पष्टीकरण की गारंटी देता है।
प्रश्न ठीक से ठीक है। मैं जावा स्ट्रिंग.substring (int startIndex, int endIndex) विधि में सॉफ़्टवेयर गलती के रूप में इसे देखता हूं।
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int,%20int%29।
जावा डॉक्स https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
जावा/C/C++ और हर दूसरे भाषा है कि मैं के बारे में पता सरणी तत्वों के बीच 'विभक्त' के रूप में सरणी सूचकांक देखने नहीं करता है।
पैरामीटर्स: startIndex - शुरुआत सूचकांक, समावेशी। एंड इंडेक्स - समापन सूचकांक, विशेष।
या तो एंड इंडेक्स का गलत नाम दिया गया है क्योंकि भाषा अंत में इंडेक्स + 1 पर पते तक स्मृति पहुंच की अनुमति नहीं देती है, जिसमें अंतिम सरणी तत्व शामिल करना आवश्यक है या एंड इंडेक्स गलत परिभाषित है और यह होना चाहिए: एंड इंडेक्स - समापन सूचकांक, समावेशी ।
सबसे संभावित मामला यह है कि दूसरा पैरामीटर गलत नाम दिया गया था। यह होना चाहिए: लंबाई - शुरुआत इंडेक्स से शुरू होने वाली स्ट्रिंग की लंबाई।
हम जानते हैं कि गोस्लिंग परिचितता के लिए सी/सी ++ भाषाओं पर जावा वाक्यविन्यास आधारित है। सी +++ स्ट्रिंग क्लास http://www.cplusplus.com/reference/string/string/substr/ से हम विधि परिभाषा देखते हैं:
स्ट्रिंग सबस्ट्र (size_t pos = 0, size_t len = npos) const;
ध्यान दें कि विधि परिभाषा में दूसरा पैरामीटर लंबाई के लिए 'लेन' है।
लेन सबस्ट्रिंग में शामिल करने के लिए वर्णों की संख्या (यदि स्ट्रिंग कम है, जितना संभव हो उतने पात्रों का उपयोग किया जाता है)।
टेस्टस्ट्रिंग में 10 वर्ण हैं, इंडेक्स पोजिशन 0 से 9 तक हैं। 10 का एंड इंडेक्स निर्दिष्ट करना हमेशा इंडेक्सऑटऑफबाउंड एक्सेप्शन() को फेंकना चाहिए क्योंकि टेस्टस्ट्रिंग का कोई अंत 10 नहीं है।
हम ठोस मूल्यों सी ++ विधि की ओर देखने वाले JUnit में विधि का परीक्षण करते हैं, तो हम उम्मीद करते हैं:
स्ट्रिंग testString = "testString"; assertThat (testString.substring (4, 6), बराबर ("स्ट्रिंग"));
लेकिन निश्चित रूप से हम अपेक्षित हो: "स्ट्रिंग" लेकिन था "सेंट"
सूचकांक 0 से testString की लंबाई 'स्ट्रिंग' में 'जी' चार के लिए 10 वर्ण है। यदि हम 10 को 'एंड इंडेक्स' पैरामीटर के रूप में उपयोग करते हैं,
स्ट्रिंग testString = "testString"; assertThat (testString.substring (4, 10), बराबर ("स्ट्रिंग"));
जुनीट से "पास"।
हम "lengthOfSubstringFromIndex0" करने के लिए पैरामीटर 2 का नाम बदलते हैं आप ENDINDEX करने के लिए की जरूरत नहीं है - 1 गिनती) जब एक ENDINDEX, 10 को निर्दिष्ट, और यह कभी IndexOutOfBoundsException (फेंकता है कि उम्मीद है, कि सीमा से बाहर के लिए है अंतर्निहित सरणी http://docs.oracle.com/javase/7/docs/api/java/lang/IndexOutOfBoundsException.html
यह केवल उन समयों में से एक है जिन्हें आपको इस विधि के idiosyncrasy को याद रखना होगा। दूसरा पैरामीटर सही ढंग से नामित नहीं है। जावा विधि हस्ताक्षर होना चाहिए:
public String substring(int beginIndex,
int lengthOfSubstringFromIndex0)
या सी ++ स्ट्रिंग :: सबस्ट्र विधि से मेल खाने के लिए विधि को फिर से परिभाषित किया गया है। पाठ्यक्रम की परिभाषा का मतलब पूरे इंटरनेट को फिर से लिखना होगा, इसलिए इसकी संभावना नहीं है।
आह! टिप दोस्तों के लिए धन्यवाद, मैं एक ही दस्तावेज़ पृष्ठ पर देख रहा था लेकिन मुझे नहीं पता था कि मुझे अधिक जानकारी प्राप्त करने के लिए सभी तरह से नीचे स्क्रॉल करना पड़ा था ... –
इच्छा है कि जावाडोक के बारे में कोई नोट हो, या मेरे जैसे लापरवाह लोग 'इंडेक्सऑटऑफबाउंड एक्सेप्शन' की उम्मीद है अगर शुरू होता है Index = String.length()। –