Alguém pode me ajudar a achar o erro?

import java.util.*;

public class Main {
    static ArrayList<Usuario> usuarios = new ArrayList<>();
    static Usuario usuarioAtual;
public static void main(String[] args) {
    
            
            Scanner scanner = new Scanner(System.in);
        int opcao;

        // Adiciona alguns usuários de exemplo
        usuarios.add(new Usuario(1, "leao", "leao","leao","leao",false));
        usuarios.add(new Usuario(2, "leao","leao","leo","leo",true));

        do {
            System.out.println("1 - Login");
            System.out.println("2 - Criar usuário");
            System.out.println("3 - Alterar usuário");
            System.out.println("4 - Remover usuário");
            System.out.println("0 - Sair");
            System.out.print("Opção: ");
            opcao = scanner.nextInt();

            switch (opcao) {
                case 1:
                    login();
                    break;
                case 2:
                    criarUsuario();
                    break;
                case 3:
                    alterarUsuario();
                    break;
                case 4:
                    removerUsuario();
                    break;
                case 0:
                    System.out.println("Saindo...");
                    break;
                default:
                    System.out.println("Opção inválida");
            }

            System.out.println();
        } while (opcao != 0);

        scanner.close();
    }

    static void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Usuário: ");
        String login = scanner.next();
        System.out.print("Senha: ");
        String senha = scanner.next();

        Usuario usuario = null;
        for (Usuario u : usuarios) {
            if (u.getLogin().equals(login) && u.getSenha().equals(senha)) {
                usuario = u;
                break;
            }
        }

        if (usuario != null) {
            usuarioAtual = usuario;
            System.out.println("Bem-vindo, " + usuario.getLogin());
            if (usuario.isAdministrador()) {
                System.out.println("Você é um administrador");
            }
        } else {
            System.out.println("Usuário ou senha inválidos");
        }

        scanner.close();
    }

    static void criarUsuario() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("id: ");
        int id = scanner.nextInt();
        System.out.print("email: ");
        String email = scanner.next();
        System.out.print("nome: ");
        String nome = scanner.next();
        System.out.print("login: ");
        String login = scanner.next();
        System.out.print("senha: ");
        String senha = scanner.next();
        usuarios.add(new Usuario(id,email,nome,login,senha,false));
        System.out.println("Usuário criado com sucesso");
        scanner.close();
    }

    static void alterarUsuario() {
        if (usuarioAtual == null) {
            System.out.println("Faça login antes de continuar");
            return;
        }
        if (!usuarioAtual.isAdministrador()) {
            System.out.println("Você não tem permissão para executar essa ação");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.print("Usuário a ser alterado: ");
        String username = scanner.next();
        Usuario usuario = null;
        for (Usuario u : usuarios) {
            if (u.getLogin().equals(username)) {
                usuario = u;
                break;
            }
        }
        if (usuario == null) {
            System.out.println("Usuário não encontrado");
            return;
        }
        System.out.print("Nova senha (deixe em branco para manter a mesma): ");
         
        String novaSenha = scanner.next();
    if (!novaSenha.isEmpty()) {
        usuario.setSenha(novaSenha);
    }
    System.out.println("Usuário alterado com sucesso");
    scanner.close();
    }
    
    
    static void removerUsuario() {
    if (usuarioAtual == null) {
        System.out.println("Faça login antes de continuar");
        return;
    }
    if (!usuarioAtual.isAdministrador()) {
        System.out.println("Você não tem permissão para executar essa ação");
        return;
    }
    Scanner scanner = new Scanner(System.in);
    System.out.print("Usuário a ser removido: ");
    String username = scanner.next();
    Usuario usuario = null;
    for (Usuario u : usuarios) {
        if (u.getLogin().equals(username)) {
            usuario = u;
            break;
        }
    }
    if (usuario == null) {
        System.out.println("Usuário não encontrado");
        return;
    }
    usuarios.remove(usuario);
    System.out.println("Usuário removido com sucesso");
    scanner.close();
}
}



        
        

Retorna issoException in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:941) at java.base/java.util.Scanner.next(Scanner.java:1598) at java.base/java.util.Scanner.nextInt(Scanner.java:2263) at java.base/java.util.Scanner.nextInt(Scanner.java:2217) at Main.main(Main.java:24) Op��o: C:\Users\Leand\AppData\Local\NetBeans\Cache\17\executor-snippets\run.xml:111: The following error occurred while executing this line: C:\Users\Leand\AppData\Local\NetBeans\Cache\17\executor-snippets\run.xml:68: Java returned: 1 BUILD FAILED (total time: 11 seconds)

Primeiro: Quando usar o Scanner para ler entrada de dados pelo TECLADO, utilize somente o método nextLine(), não vou explicar o motivo, há bastante material explicando, basicamente o seu problema está acontecendo por causa da quebra de linha gerada ao pressionar ENTER, o único método do Scanner que consome essa quebra de linha é o nextLine().

Segundo: Instancie somente um Scanner, você está instanciando vários, está instanciando um em cada método.
O System.out é único e o System.in também é unico então não faz sentido criar vários Scanner para ler o mesmo System.in.

Terceiro: Pra que fazer tudo static, via de regra, se não sabe quando utilizar static, não utilize.

Quando não uso o static ele não executa a main o que faço?

Sim, o método main é o ponto de entrada do seu programa, esse precisa ser static, mas os outros métodos e atributos não, pelo menos não para esse seu exercício.