Android में String.isEmpty () कॉल नहीं कर सकते


80

अपने Android आवेदन में मैं String.isEmpty () फ़ंक्शन का उपयोग नहीं कर सकता जो कि JDK 1.6 में स्थित है। Android 2.1 lib का java.lang.String वर्ग में यह फ़ंक्शन नहीं है

मैंने अपने प्रोजेक्ट के लिए JRE सिस्टम लाइब्रेरी को इनपुट करने की कोशिश की, क्योंकि इसमें यह फ़ंक्शन है, लेकिन कोई प्रभाव नहीं था।

मैं इस समस्या को कैसे हल कर सकता हूं और अपने एप्लिकेशन को इस फ़ंक्शन का उपयोग करने की अनुमति दूंगा?


11
isEmpty एपीआई स्तर 9 में जोड़ा गया है। यहां देखें डेवलपर
मुदस्सिर

3
अजीब, मैं इस समस्या में नहीं आया हूं। मैं हालांकि .isEmpty () का उपयोग करने से बचता हूं। मैं सिर्फ अगर (myString == null) myString.trim () (आकार) () == 0) का उपयोग करना चाहता हूं
अली

1
@ अलि - उघ !! ऐसा लगता है कि आप जिस कोड पर काम करते हैं, वह अपने API / इंटरफ़ेस की पूर्व-स्थितियों और पोस्ट-शर्तों को निर्दिष्ट करने और जांचने का एक बुरा काम कर रहा है।
स्टीफन सी

वैसे, आप जावा को कोड को संकलित करने के लिए भी कह सकते हैं जो JRE के एक विशेष संस्करण के साथ संगत हो। मैंने कभी इसकी कोशिश नहीं की है, लेकिन मुझे आश्चर्य है कि अगर यह इस उदाहरण में एक आसान समाधान होगा। @ स्टेपेन: मुझे हमारे सॉफ्टवेयर आर्किटेक्ट द्वारा विशेष रूप से बताया गया है कि जब कोई एपीआई कॉल से मूल्य प्राप्त होता है, तो हमेशा नल की जांच करें। इसके अलावा, उपयोगकर्ता इनपुट के साथ, हमारे पास अक्सर एक असंगतता होती है जहां सामने का अंत अशक्त हो सकता है यदि उपयोगकर्ता खाली है या खाली स्ट्रिंग है तो उपयोगकर्ता फ़ील्ड को केंद्रित करता है लेकिन कुछ भी टाइप नहीं करता है। अजीब मैं जानता हूँ।
अली

2
@ अलि - मैं आपके आर्किटेक्ट से प्रभावित नहीं हूँ। IMO, प्रत्येक API के बजाय स्रोत पर नल से पता लगाने और निपटने के लिए एक बेहतर विचार है। इसके अलावा, अप्रत्याशित नल को कीड़े के रूप में समझें और उन्हें एनपीई में बदल दें। नल के लिए स्पष्ट रूप से परीक्षण के साथ परेशानी यह है कि आपका कोड व्यर्थ चेक के साथ बंद कर दिया गया है, और आप रिक्त तारों को (उदाहरण के लिए) में बदलकर नल को "फिक्सिंग" के जाल में पड़ सकते हैं।
स्टीफन सी

जवाबों:


83

मैं इस समस्या को कैसे हल कर सकता हूं और अपने एप्लिकेशन को इस फ़ंक्शन का उपयोग करने की अनुमति दूंगा?

आप नहीं कर सकते।

String.length() == 0इसके बजाय उपयोग करें । यह JDK 1.0 पर वापस सभी तरह से संगत है ... और J2ME के ​​साथ भी।

String.equals("") एक और विकल्प है।


क्या आप सुनिश्चित हैं कि ग्रहण को निश्चित पुस्तकालयों से कोड कक्षाओं में डालने का कोई तरीका नहीं है?

नहीं अगर आप चाहते हैं कि आपका ऐप असली एंड्रॉइड डिवाइस पर चले । जावा / एंड्रॉइड प्लेटफॉर्म जानबूझकर आपके लिए कोर क्लास लाइब्रेरीज़ के व्यवहार के साथ छेड़छाड़ करना कठिन बनाते हैं। एक शुरुआत के लिए, आप इसे केवल बूटक्लासपाथ या rt.jarफ़ाइल के डेवेलिक समकक्ष को संशोधित करके कर सकते हैं , और इनमें से कोई भी चल रहे जेवीएम के भीतर नहीं किया जा सकता है।

इस तरह की छेड़छाड़ से अन्य ऐप्स के लिए संभावित रूप से जावा को तोड़ने का जोखिम होता है। यहां तक ​​कि यह मानते हुए कि आप सीधे एंड्रॉइड ऐप सेपरेशन से समझौता नहीं कर सकते हैं (नीचे उल्लिखित प्रक्रिया / यूआईडी सेपरेशन के कारण), दुर्भावनापूर्ण ट्वीक (साझा) जावा कोर क्लास अभी भी संभावित रूप से एक ऐप को दूसरे ऐप से हस्तक्षेप करने या जानकारी चुराने की अनुमति दे सकता है। ।


समस्या यह है, कि मैं JSONRPC के साथ काम, नि: शुल्क पुस्तकालय से वर्गों का उपयोग code.google.com/p/json-simple और वहाँ एक समारोह JSONRPC2Message.parse (स्ट्रिंग arg0) है, जो String.isEmpty (का उपयोग करें) विधि है, इसलिए जब मैं अपना ऐप चलाता हूं मुझे java.lang.noSuchMethodError अपवाद मिलता है। क्या आप सुनिश्चित हैं कि ग्रहण को निश्चित पुस्तकालयों से कोड कक्षाओं में डालने के लिए कॉन्फ़िगर करने का कोई तरीका नहीं है? अगर मैं एंड्रॉइड 2.1 लाइब्रेरी से नहीं, बल्कि JRE सिस्टम लाइब्रेरी से स्ट्रिंग क्लास का उपयोग करना चाहता हूं तो मेरा मतलब है?
तेराटीक

7
Json-simple खुला स्रोत है; लाइब्रेरी का अपना संस्करण बनाएँ जो String.isEmpty () का उपयोग नहीं करता है। एंड्रॉइड रनटाइम लाइब्रेरी को अनुकूलित करने की कोशिश करने की तुलना में यह बहुत सरल (और सुरक्षित) है।
थ्रेडेड

अगर उन्होंने ऐसा नहीं किया तो सुरक्षा को कम करने के लिए एक दुष्ट ऐप के लिए यह तुच्छ होगा - मुझे वास्तव में इस पर संदेह है। प्रत्येक एप्लिकेशन अपने स्वयं के यूआईडी के तहत एक अलग लिनक्स प्रक्रिया में चलता है, और एंड्रॉइड सुरक्षा जावा पैकेज सुरक्षा पर भरोसा नहीं करता है। अगर कोई ऐप अपनी खुद की कॉपी को संशोधित करता है तो इसका Stringअन्य ऐप्स पर कोई प्रभाव नहीं पड़ता है।
poolie

@poolie - ठीक है, लेकिन क्या ऐप चलाने वाले "JVM" के भीतर कुछ सैंडबॉक्सिंग नहीं है? (मुझे यह विश्वास करना थोड़ा मुश्किल है कि यह लिनक्स-स्तर की सुरक्षा एकमात्र सुरक्षा है जो आपके एंड्रॉइड फोन पर चलने वाले दुष्ट ऐप्स के खिलाफ है।)
स्टीफन सी


120

आप इसके बजाय android.text.TextUtils.isEmpty () का उपयोग कर सकते हैं । यह विधि यह देखने के लिए भी जांचती है कि स्ट्रिंग शून्य है और एपीआई स्तर 1 के बाद से उपलब्ध है।

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}

6

यह विधि API9 में दिखाई दी, इसलिए आप Android2.3 से पहले इसका उपयोग नहीं कर सकते


5

आप इसका उपयोग कर सकते हैं TextUtils.isEmpty(str)। यह एपीआई स्तर 1 के बाद से उपलब्ध है या आप नीचे की तरह खुद की विधि बना सकते हैं

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

2
मुझे लगता है कि यह चयनित उत्तर होना चाहिए। Usint TextUtils सबसे अच्छा विकल्प है। आप एक ही बनाने के लिए अपने स्वयं के समारोह बनाने के लिए नहीं है।
गनौत

तुम्हें पता है तुम सिर्फ लिखा जा सकता है return (str == null || str.length() == 0);, है ना?
Piovezan

@Piovezan हाँ हम इसे भी लिख सकते हैं
शान Xeeshi

4

जहाँ तक मुझे पता है android java 5 को सपोर्ट करता है, इसलिए ऐसा कोई भी नहीं है isEmpty();जिसे आप length()अनुकरण करने के लिए उपयोग कर सकते हैंisEmpty()


1

""। असामान (आपका स्ट्रिंग); भी String.isEmpty () की तरह ही व्यवहार देता है;


यह वास्तव में सबसे अच्छा समाधान है क्योंकि यह एक NullPointerException
Lukas

यह सबसे अच्छा समाधान नहीं है, क्योंकि आप हर बार एक नई स्ट्रिंग ऑब्जेक्ट बना रहे हैं, जिसकी आप तुलना करना चाहते हैं, जबकि आप के साथ ईमप्टी नल और लंबाई की जाँच कर रहे हैं।
गनौत

2
@ user1422434 - नहीं, आप नहीं हैं। पूरे वीएम के लिए खाली स्ट्रिंग शाब्दिक का प्रतिनिधित्व करने वाली एक और केवल एक वस्तु है।
स्टीफन सी

लेकिन मैं @ लुकास से भी असहमत हूं। समाधान जो "एनपीई को रोकते हैं" आमतौर पर एक बुरा विचार बोल रहे हैं। एक बेहतर विचार यह पता लगाना है कि अप्रत्याशित कहाँ nullसे आ रहा है और उस समस्या को ठीक करें । "".equals(yourString)दृष्टिकोण केवल एक अच्छा समाधान है, तो एक nullके लिए मूल्य yourStringसार्थक ... और अपेक्षित है।
स्टीफन सी

-4

आपको एंड्रॉइड एपीआई को 9 के स्तर पर अपग्रेड करना होगा, String.trim().length()==0या String.equals("")इसके बजाय इसका उपयोग करना होगा, यह आपके एंड्रॉइड एपीआई स्तर और आपके जेडीके संस्करण के लिए काम करना चाहिए।


क्या? स्ट्रिंग " "खाली नहीं है! आप स्ट्रिंग को ट्रिम करने का सुझाव क्यों देते हैं?
ruX

1
@ruX " ".trim()खाली हो जाएगा !!! क्या आपको भी पता है कि ?? अगर आप मेरे वर्णन को नहीं समझते हैं तो दर मत करो !!!
इंजन बाई

@ यूजनी बाई String.trim().length()==0और String.equals("")अलग-अलग परिणाम लौटाएं String = " "। दूसरा स्निपेट सही है
ruX
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.