2009-10-07 21 views
7

ठीक है, यह बेवकूफ है, लेकिन wtf चल रहा है?मेरी स्ट्रिंग तुलना क्यों काम नहीं करती है?

मेरे पास एक सर्वलेट में एक स्ट्रिंग चर है, जो पैरामीटर का मान लेता है और उस मान के आधार पर मैं कुछ करने के लिए एक परीक्षण करता हूं, लेकिन if काम नहीं कर रहा है। समस्या क्या है?

String action = request.getParameter("action"); 
    System.out.println("Action: " + action); 
// I put 2 ifs to be sure, but not even one is working 
    if(action.equals("something")) 
      { 
       System.out.println("hey");    
      } 
    if(action.trim() == "something") 
      { 
       System.out.println("hey"); 
      } 

कंसोल पर, System.out.println मुझे पता चलता है कि कार्य के मूल्य को "कुछ"

Action: something 
+0

क्या काम नहीं कर रहा है? क्या "हे" केवल एक बार मुद्रित है, और क्या आप इसे दो बार मुद्रित होने की उम्मीद करते हैं? क्या आपके कंसोल पर "हे" दिखाई नहीं दे रहा था? –

+0

वह बहुत विशिष्ट है: // मैंने 2 आईएस को सुनिश्चित करने के लिए रखा है, लेकिन कोई भी काम नहीं कर रहा है। – dpq

+8

कृपया इसे "जावा" न कहें - यह "जावा" है। नाम एक संक्षिप्त शब्द नहीं है, इसलिए आपको इसे सभी कैप्स के साथ लिखने की आवश्यकता नहीं है। – Jesper

उत्तर

37

आपकी दूसरी तुलना गलत है। आप भी इस तरह के बजाय equals का उपयोग करना चाहिए == की,:

if (action.trim().equals("something")) 

== ऑपरेटर संदर्भ (स्ट्रिंग) वस्तुओं की और सामान्य परिस्थितियों में तुलना बराबर तार स्वचालित रूप से एक ही संदर्भ, यानी वे की जरूरत नहीं है विभिन्न वस्तुओं हैं। (जब तक कि internalized दोनों नहीं हैं, लेकिन आम तौर पर आपको इसे नहीं मानना ​​चाहिए)

इसके अलावा आपका उदाहरण ठीक काम करता है और पहली तुलना मान्य है। दूसरी तुलना को ठीक करने का प्रयास करें। अगर यह काम करता है, तो आपको अपनी समस्या मिली। यदि नहीं, तो डीबगर का उपयोग करने का प्रयास करें और सबकुछ दोबारा जांचें।

पुनश्च:

"something".equals(action) 

इस तरह आप NullPointerExceptions से बच सकते हैं जब स्ट्रिंग वस्तु रिक्त है: जब गतिशील स्ट्रिंग वस्तुओं के साथ शाब्दिक तार तुलना करते समय, शाब्दिक स्ट्रिंग पर equals विधि कॉल करने के अच्छी आदत है।

+8

+1। –

-7

बराबर विधि वस्तु पहचान के लिए स्ट्रिंग की तुलना करता है और सामग्री की तुलना नहीं करता है। दो तारों की सामग्री की तुलना करने के लिए, तुलना करने के लिए विधि का उपयोग करें।

+10

यह सादा गलत है। 'String.equals() 'तारों की तुलना करता है और' सत्य 'देता है यदि वे समान हैं-जैसा कि कोई अपेक्षा करेगा। – Bombe

0

बस एक जंगली अनुमान: यह हो सकता है कि इनमें से एक "somethings" में शामिल है उदा। एक सिरिलिक चरित्र जो इसके लैटिन समकक्ष के समान दिखता है। इस मामले में, यह "ओ" हो सकता है।

9

आपकी दूसरी स्थिति कभी भी सत्य होने की संभावना नहीं है - आप परीक्षण कर रहे हैं कि action को ट्रिम करके बनाई गई स्ट्रिंग ऑब्जेक्ट स्ट्रिंग अक्षर "something" के समान वस्तु है। यह केवल तभी सच होगा यदि action कहीं और उसी शाब्दिक मूल्य पर सेट हो। इसके बजाय "something".equals(action.trim()) का उपयोग करें।

आपकी पहली शर्त सच होगी action स्ट्रिंग में वर्ण "something" वर्ण हैं। यदि यह सच नहीं है, तो यह नहीं है। इसे एक परीक्षण में डालें, इसे लॉग करें, प्रिंट करें या इसे डीबगर में देखें।

यदि आप डिबगिंग के लिए स्ट्रिंग प्रिंट करते हैं, तो System.out.println ("String = >" + string + "<"); जैसे कुछ का उपयोग करें ताकि यह स्पष्ट हो कि कोई पीछे की जगहें हैं या नहीं।

+0

आपका उत्तर प्राथमिकता दी जानी चाहिए, यह अधिक सही है और यहां तक ​​कि एनपीई: (सिद्धांत में, इस सटीक मामले में नहीं 'से बचाता है। ओह ठीक है, यहां उम्मीद है कि अन्य लोगों के भार भी ध्यान दें। – Esko

+0

+1 ">" के अंदर प्रिंटिंग स्ट्रिंग के लिए +1, यह सिर्फ एक स्ट्रिंग न्यूलाइन को हाइलाइट करता है जो मेरी स्ट्रिंग.मैट्स() के साथ गड़बड़ कर रहा था! – shearn89

4

जावा में स्ट्रिंग तुलना == द्वारा नहीं की जा सकती है।

वैसे, String.compareTo() रिटर्न 0String.equals() जबकि रिटर्न true जब दो तार के बराबर हैं -

आप String.equals() या String.compareTo() उपयोग करना होगा।

देखें: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)

+1

जो भी आप कहते हैं वह सत्य है, लेकिन अगर आपने समझाया है तो यह अधिक उपयोगी होगा यदि यह सच है। (Ie, 'a.equals (बी) 'परीक्षण करता है कि दो तारों की सामग्री समान है, लेकिन' = == बी' केवल तभी सच होती है जब ए और बी दोनों एक ही स्ट्रिंग ऑब्जेक्ट को संदर्भित करते हैं।) –

1

मेरा अनुमान है कि आप पीछे चल या प्रमुख रिक्त स्थान जो println में दिखाई नहीं देते हो गया है।

इस तथ्य के साथ इसे संयोजित करें कि आप action.trim() == 'something' का उपयोग कर रहे हैं इसका मतलब है कि यह परीक्षण या तो काम नहीं करेगा।

इसे .equals("something") पर स्विच करें जैसा कि अन्य लोगों द्वारा सुझाया गया है और यह काम कर सकता है।

+1

मैं अक्सर करता हूं 'System.out.println ("एक्शन: [" + एक्शन +'] ');' डीबग के लिए आप पीछे की जगहों को देख सकते हैं। –

+0

क्षमा करें कि 'System.out.println ("एक्शन: [" + एक्शन + "]") होना चाहिए;'। मैं आज सुबह जावास्क्रिप्ट लिख रहा हूं :) –

1

स्ट्रिंग अक्षरशः पहले के आसपास के खंडों को स्विच करके आप नल के खिलाफ बेहतर ढंग से रक्षा कर सकते हैं।

लेकिन जब से तुम भी पैरामीटर मान पर खाली स्थान के खिलाफ की रक्षा करना चाहते हैं लगता है, आप भी Apache Commons Lang से StringUtils.trimToEmpty का उपयोग कर पैरामीटर मान के एक अशक्त सुरक्षित ट्रिम कर सकता है:

String action = StringUtils.trimToEmpty(request.getParameter("action")); 

System.out.println("Action: " + action); 

if("something".equals(action)) { 
    System.out.println("hey");    
} 
0

इस प्रयास करें:

String action = request.getParameter("action"); 
System.out.println("Action: " + action); 

if(action.trim().equals("something")) 
{ 
    System.out.println("hey");    
} 
संबंधित मुद्दे