【JAVA學習】Iterator迭代器導致的java.util.NoSuchElementException原因與解決方法


簡單的說:

原因:循環中不能用兩次(含)的next()方法。

解決方法:將next()取出的數據先傳給一個新的對象,用的時候再想方法取出來。


我們可以在JDK文檔中看到 Iterator 的三個方法(如下表),java.util.NoSuchElementException是由next()導致的!見下面紅字


方法摘要
boolean hasNext()
如果仍有元素可以迭代,則返回 true
E next()
返回迭代的下一個元素。
void remove()
從迭代器指向的 collection 中移除迭代器返回的最後一個元素(可選操作)。

next

E next()
返回迭代的下一個元素。
返回:
迭代的下一個元素。
拋出:

NoSuchElementException - 沒有元素可以迭代。      ←就是這裏

異常代碼如下:

//用迭代器遍歷hashMap,並方符合條件時返回值,常識:迭代器初始位置指在在列表第一個數據的上面,而不是指在第一個數據!重點是next()方法不能在循環中調用兩次,否則會報java.util.NoSuchElementException
boolean isOk = false;
Iterator<Map.Entry<String, String>>  iter = map.entrySet().iterator();
while(iter.hasNext()){ //hashNext()
		
	if(name.equals(iter.next().getKey())){//next()一次
				
		System.out.println("姓名:" + iter.next().getKey();//兩次
		System.out.println("電話:" + iter.next().getValue();//三次
		isOk = true;
		break;
	}
}
	if(isOk) {
		//nothing	
	}
	else{
		System.out.println("查無此人!");
	}


改進過後的代碼如下:

boolean isOk = false;
Iterator<Map.Entry<String, String>>  iter = map.entrySet().iterator();
		
while(iter.hasNext()){
	Map.Entry<String, String> index = iter.next();//next() 僅此一次,創建了一個新對象,並將next()取出的值傳給它

	String outname = index.getKey();//再將值取出
	String outnumber = index.getValue();//再將值取出

			
	if(name.equals(outname)){//這裏也不用next()方法了
		System.out.println("姓名:" + outname);
		System.out.println("電話:" + outnumber);
		isOk = true;
		break;
	}
}
	if(isOk) {
			//nothing
	}
	else{
		System.out.println("查無此人!");
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章