Java 将 instanceof 与迭代器一起使用

Java use instanceof with iterator

我有一个抽象 class Usuario 和一个 ArrayList<Usuario> 及其三个子 class 的对象。我现在想遍历 ArrayList 和 return 一个值,具体取决于对该对象使用 instanceof 的结果。

我得到一个错误:java.util.NoSuchElementException

我想这是因为迭代器是 Iterator 的对象而不是来自 Usuario 的任何子 classes。我对吗?有解决办法吗?

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

您在迭代期间多次调用 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) {
    ...

Iterator.next() returns 下一个项目并前进光标。这不是你想要的,所以试试这个:

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() 的第一次调用将 return 第一个元素,但由于类型不匹配,您发出对 next() 的第二次调用,其中 return 是第二个元素。同样,类型不匹配,因此您第三次调用 next() (itUsuarios.next() instanceof BibliotecaExterna) 但是 没有第三个元素 因此您将得到 NoSuchElementException.

你的代码中存在一个巨大的误解:

如果您的当前元素是 BibliotecaExterna 的实例,它将在 first if 语句中调用 next() 并根据 UsuarioBiblioteca.但是后来元素已经改变了。

而是存储在开头:

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