2011-08-23 20 views
38

Tôi đang cố gắng để lặp qua một danh sách các phím từ một bảng băm bằng cách sử dụng liệt kê tuy nhiên tôi tiếp tục nhận được một NoSuchElementException tại khóa cuối cùng trong danh sách?iterating thông qua liệt kê các phím hastable ném NoSuchElementException lỗi

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(); 
} 

điều khiển đầu ra:

 
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) 

Trả lời

70

Bạn gọi nextElement() hai lần trong vòng lặp của bạn. Cuộc gọi này di chuyển con trỏ liệt kê về phía trước. Bạn nên thay đổi mã của bạn như sau:

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

Bạn đang kêu gọi nextElement hai lần. Cấu trúc lại như thế này:

while(e.hasMoreElements()){ 


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

Bạn đang gọi điện thoại e.nextElement() hai lần trong vòng lặp của bạn khi bạn đang chỉ đảm bảo rằng bạn có thể gọi nó một lần mà không có một ngoại lệ. Viết lại vòng lặp như sau:

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

Mỗi lần bạn gọi e.nextElement() bạn lấy đối tượng tiếp theo từ trình lặp. Bạn phải kiểm tra e.hasMoreElement() giữa mỗi cuộc gọi.


Ví dụ:

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

Đây dường như là câu trả lời đầu tiên. Đó là câu trả lời đã được xác nhận hoặc tôi có thiếu gì đó không? –

+0

@PascalGanaye Câu trả lời này đã bỏ sót lỗi chứa câu hỏi. – Svish

1

Mỗi lần bạn làm e.nextElement() bạn bỏ qua một. Vì vậy, bạn bỏ qua hai phần tử trong mỗi lần lặp của vòng lặp của bạn.

3

Bạn đang gọi nextElement hai lần trong vòng lặp. Bạn chỉ nên gọi nó một lần, nếu không nó sẽ di chuyển về phía trước hai lần:

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

tốt hơn rất nhiều so với giải pháp vòng lặp while !! –

+20

Vô cùng hiệu quả! 'Collections.list' tạo một' ArrayList' mới và sao chép mỗi giá trị từ liệt kê vào danh sách mới trước khi trả về tham chiếu danh sách. Một mức giá rất lớn để trả cho cú pháp dễ thương. –

+2

@AndyBrown không nếu danh sách của bạn nhỏ hoặc không lớn lắm. Và .. cú pháp dễ thương giúp làm cho mã rõ ràng hơn. –

Các vấn đề liên quan