2011-08-23 14 views
38

मैं गणना का उपयोग करके हैश तालिका से कुंजी की एक सूची के माध्यम से पुन: प्रयास करने की कोशिश कर रहा हूं, हालांकि मुझे सूची में अंतिम कुंजी पर NoSuchElementException मिल रहा है?hastable कुंजी के गणना के माध्यम से पुनरावृत्त NoSuchElementException त्रुटि

Hashtable<String, String> vars = new Hashtable<String, String>(); 

vars.put("POSTCODE","TU1 3ZU"); 
vars.put("EMAIL","[email protected]"); 
vars.put("DOB","02 Mar 1983"); 

Enumeration<String> e = vars.keys(); 

while(e.hasMoreElements()){ 

System.out.println(e.nextElement()); 
String param = (String) e.nextElement(); 
} 

कंसोल आउटपुट:

 
EMAIL 
POSTCODE 
 
Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator 
    at java.util.Hashtable$Enumerator.nextElement(Unknown Source) 
    at testscripts.webdrivertest.main(webdrivertest.java:47) 

उत्तर

70

आप अपने पाश में दो बार nextElement() कहते हैं। यह कॉल गणना सूचक आगे बढ़ता है। आप निम्न की तरह अपने कोड को संशोधित करना चाहिए:

while (e.hasMoreElements()) { 
    String param = e.nextElement(); 
    System.out.println(param); 
} 
3

आप nextElement दो बार बुला रहे हैं। इस तरह refactor:

while(e.hasMoreElements()){ 


String param = (String) e.nextElement(); 
System.out.println(param); 
} 
3

आप अपने पाश अंदर दो बार e.nextElement() कॉल कर रहे हैं जब आप केवल गारंटी कर रहे हैं कि आप इसे एक बार एक अपवाद के बिना कॉल कर सकते हैं। इसलिए जैसे पाश पुनर्लेखन:

while(e.hasMoreElements()){ 
    String param = e.nextElement(); 
    System.out.println(param); 
} 
8

हर बार जब आप फोन e.nextElement() आप पुनरावर्तक से अगले ऑब्जेक्ट ले। आपको प्रत्येक कॉल के बीच e.hasMoreElement() जांचना होगा।


उदाहरण:

while(e.hasMoreElements()){ 
    String param = e.nextElement(); 
    System.out.println(param); 
} 
+0

यह पहला जवाब प्रतीत होता है। यह मान्य उत्तर है या क्या मुझे कुछ याद आ रहा है? –

+0

@PascalGanaye इस उत्तर में बग सवाल शामिल है। – Svish

1

हर बार जब आप e.nextElement() कर आप एक को छोड़ दें। तो आप अपने लूप के प्रत्येक पुनरावृत्ति में दो तत्वों को छोड़ दें।

3

आप लूप में अगले दो बार कॉल कर रहे हैं। आप इसे केवल एक बार फोन करना चाहिए, वरना यह आगे दो बार ले जाता है:

while(e.hasMoreElements()){ 
    String s = e.nextElement(); 
    System.out.println(s); 
} 
52
for (String key : Collections.list(e)) 
    System.out.println(key); 
+1

जबकि लूप समाधान से बहुत बेहतर !! –

+20

बड़े पैमाने पर अक्षम! 'संग्रह। सूची' एक नया 'ऐरेलिस्ट' बनाता है और सूची संदर्भ लौटने से पहले गणना से प्रत्येक मान को नई सूची में कॉपी करता है। सुंदर वाक्यविन्यास के लिए भुगतान करने के लिए एक बहुत बड़ी कीमत। –

+2

@AndyBrown अगर आपकी सूची छोटी नहीं है या बहुत बड़ी नहीं है। और .. प्यारा वाक्यविन्यास कोड को और स्पष्ट करने में मदद करता है। –