2016-07-04 104 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 ...) 
...