我有一个抽象类Usuario
和一个ArrayList<Usuario>
,其中包含三个子类的对象。我现在想要遍历ArrayList
并根据对该对象使用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;
}
答案 0 :(得分: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
)但没有第三个元素,因此您将获得{{1} }。
答案 1 :(得分: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) {
...
答案 2 :(得分:0)
您的代码中存在一个巨大的误解:
如果您当前的元素是next()
的实例,则会在第一个 if语句中调用UsuarioBiblioteca
,并针对Usuario element = itUsuarios.next();
if(element instance of ...)
...
进行检查。但是元素已经发生了变化。
而是将其存储在开头:
$repository->createQueryBuilder('i')
->innerJoin('i.courses','c')
->where('i.active = TRUE')
->andWhere('i.verified = TRUE')
->orderBy('i.name', 'ASC');