2016-07-04 108 views
0

我有一個抽象類Usuario和一個ArrayList<Usuario>與其三個子類的對象。我現在要遍歷ArrayList並返回一個值,具體取決於使用instanceof針對該對象的結果。Java使用instanceof迭代器

我收到一個錯誤:java.util.NoSuchElementException

我想這是因爲迭代器是Iterator的對象而不是來自Usuario的任何子類。我對嗎?有沒有解決方案?

public int comprobarDni(String dniAComprobar, ArrayList<Usuario> listaUsuarios) { 
    Iterator<Usuario> itUsuarios = listaUsuarios.iterator(); 
    while (itUsuarios.hasNext()) { 
     if (dniAComprobar.equals(itUsuarios.next().getDni())) { 
      if (itUsuarios.next() instanceof UsuarioBiblioteca) { 
       return 1; 
      } else if (itUsuarios.next() instanceof Bibliotecario) { 
       return 2; 
      } else if (itUsuarios.next() instanceof BibliotecaExterna) { 
       return 3; 
      } 
     } 
    } 
    return 0; 
} 

回答

2

您在迭代過程中多次調用itUsuarios.next

因此,當List已被完全迭代時,您可能會調用它,這將拋出java.util.NoSuchElementException

考慮分配Usuario值一次,指的是不是:快速枚舉清潔尋找代碼

while (itUsuarios.hasNext()) { 
    // reference this instead of itUsuarios.nex() for next references 
    Usuario usuario = itUsuarios.next(); 

或者...

轉到:

for (Usuario usuario: listaUsuarios) { 
    ... 
+0

很好的回答,除了增強'for'循環不是「快」。它完成同樣的事情,即使用迭代器。它更簡單,更乾淨的代碼,但它不是更快的代碼。更簡單,寫起來可能會更快,但這不是你的文本讀取方式。 – Andreas

+0

@Andreas如果內存發揮作用,這裏的「快速枚舉」只是「增強for循環」的同義詞。任何性能改進都不會有任何要求。事實上,這個成語實際上在幕後使用了一個迭代器... TL; DR寫得更快,性能相同。 – Mena

4

Iterator.next()返回下一個項目並前進光標。這不是你想的那麼試試這個:

Usuario usuario = itUsuarios.next(); 
... 

if (usuario instanceof UsuarioBiblioteca) { 
    return 1; 
} else if (usuario instanceof Bibliotecario) { 
    return 2; 
} else if (usuario instanceof BibliotecaExterna) { 
    return 3; 
} 

與您的代碼考慮以下情況:listaUsuarios只包含BibliotecaExterna類型的兩個元素。您的第一個電話next()將返回第一個元素,但由於類型不匹配,您發出第二個電話next(),它返回第二個元素。再次類型不匹配,所以你發出第三個電話next()itUsuarios.next() instanceof BibliotecaExterna),但沒有第三個元素,因此你會得到NoSuchElementException

0

。在你的代碼一個巨大的誤解:

如果您當前的元素是BibliotecaExterna一個實例,它會調用在第一next() if語句,並檢查它反對UsuarioBiblioteca。但是這個元素已經改變了。

相反,它存儲在開頭:

Usuario element = itUsuarios.next(); 
if(element instance of ...) 
...