2013-02-12 39 views
234

जावा में इस कोड की दूसरी पंक्ति ArrayIndexOutOfBoundsException क्यों फेंकता है?जावा स्ट्रिंग "।" के साथ विभाजित (डॉट)

String filename = "D:/some folder/001.docx"; 
String extensionRemoved = filename.split(".")[0]; 

जबकि नीचे काम करता है:

String driveLetter = filename.split("/")[0]; 

मैं जावा 7.

+1

एक regex स्ट्रिंग का उपयोग विभाजित नहीं करता: इस चरित्र से बचने के लिए? उस स्तिथि में "।" किसी भी चरित्र का मतलब है। – Snps

+2

... और यह सीमित करने के लिए एक डबल बैकस्लैश है। – Ben

उत्तर

513

का उपयोग आप डॉट से बचने के लिए की जरूरत है अगर आप एक शाब्दिक डॉट पर विभाजित करना चाहते हैं:

String extensionRemoved = filename.split("\\.")[0]; 

अन्यथा आप regex . पर विभाजित हैं, जो का मतलब है "कोई चरित्र"।
रेगेक्स में एक बैकस्लैश बनाने के लिए आवश्यक डबल बैकस्लैश नोट करें।


आप हो रही है एक ArrayIndexOutOfBoundsException क्योंकि आपके इनपुट स्ट्रिंग केवल एक बिंदु, यानी "." है, जो एक बढ़त मामले कि एक खाली सरणी जब डॉट पर विभाजित पैदा करता है; split(regex) परिणाम से सभी पिछला रिक्त स्थान हटा देता है, लेकिन चूंकि एक बिंदु पर एक बिंदु को विभाजित करने से केवल दो रिक्त स्थान निकलते हैं, पीछे के रिक्त स्थान हटा दिए जाने के बाद आपको खाली सरणी के साथ छोड़ दिया जाता है।

इस किनारे के मामले के लिए ArrayIndexOutOfBoundsException प्राप्त करने से बचने के लिए, split(regex, limit) के अधिभारित संस्करण का उपयोग करें, जिसमें दूसरा पैरामीटर है जो परिणामी सरणी के लिए आकार सीमा है। जब limitनकारात्मक है, जिसके परिणामस्वरूप सरणी से अनुगामी रिक्त स्थान को हटाने के व्यवहार अक्षम किया गया है:

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""] 

यानी, जब filename केवल एक बिंदु की ".", filename.split("\\.", -1)[0] बुला एक रिक्त वापस आ जाएगी, लेकिन filename.split("\\.")[0] बुला एक फेंक जाएगा ArrayIndexOutOfBoundsException

+1

ध्यान दें कि फ़ाइल नाम में एकाधिक बिंदु हो सकते हैं। किसी को "।" की अंतिम अनुक्रमणिका का उपयोग करना चाहिए और फ़ाइल नाम के सबस्ट्रिंग को खोजने के लिए इसका उपयोग करें। – saurabheights

+0

@ सोराबाइट्स प्रश्न सही रेगेक्स के बारे में नहीं था, बल्कि एक 'ArrayIndexOutOfBoundsException' क्यों था। उस ने कहा, आप गलत हैं: आपको यह जानने की आवश्यकता नहीं है कि अंतिम बिंदु कहां है; आपको बस सही regex की आवश्यकता है: 'filename.split ("\\। (? = [^।] * $)") '।यह एक * आगे देखो * का उपयोग करता है यह कहने के लिए कि मेल खाने वाले बिंदु के बाद इनपुट में कहीं भी कोई बिंदु नहीं है। – Bohemian

28

ऐसा इसलिए है क्योंकि . नियमित अभिव्यक्ति में एक आरक्षित चरित्र है, जो किसी भी चरित्र का प्रतिनिधित्व करता है।

String extensionRemoved = filename.split("\\.")[0]; 
14

मेरा मानना ​​है कि आप डॉट बच चाहिए: इसके बजाय, हम निम्न कथन का उपयोग करना चाहिए। आज़माएं:

String filename = "D:/some folder/001.docx"; 
String extensionRemoved = filename.split("\\.")[0]; 

अन्यथा डॉट को नियमित अभिव्यक्तियों में किसी भी चरित्र के रूप में व्याख्या किया जाता है।

42

"।" जावा में एक विशेष चरित्र है, इसलिए आपको "\\।" का उपयोग करना होगा

final String extensionRemoved = filename.split("\\.")[0]; 

मुझे आशा है कि इस मदद करता है

+4

यह जावा में एक विशेष चरित्र _not_ है। यह जावा के रेगेक्स इंजन में एक विशेष चरित्र है। –

+0

मैं सिर्फ अपनी प्रतिक्रिया में बहुत सटीक नहीं था लेकिन मैं आपसे सहमत हूं। परिशुद्धता के लिए धन्यवाद;) – aimhaj

+0

यह एक लायक बनाने लायक है। इसके अलावा, मुझे अभी एहसास हुआ कि मैंने थोड़ा सा गड़बड़ कर लिया है; यह जावा में एक विशेष char है, लेकिन इसीलिए यह समस्या क्यों पैदा कर रहा है। वैसे भी। –