Problema com Scanner, pulando um dado a receber

Pessoal, tenho o seguinte código (ainda em construção). É uma classe que faz parte de um programa de gerenciamento de uma Biblioteca.
Essa classe será a que vai receber os dados dos usuários. Mas venho enfrentando problemas:

  • O primeiro caso, (digitar 1), para cadastrar usuário ele não espera digitar o nome, já pula pra digitar o CPF.
    Como corrigir isso? Fica mais fácil fazer de algum outro jeito? No final do post colocarei a descrição da classe que deve ser implementada.

[code]package biblioteca.iterface;

import biblioteca.*;
import java.util.Scanner;
import java.lang.String;

/**

  • Classe Interface (interação com o usuário)
  • @author Jr Mendes
  • @version 1.0
    */

public class Interface {

public static void main(String[] args) throws InterruptedException {
System.out.println(“O que deseja fazer? “);
System.out.println(””);
System.out.println(“1- Cadastrar Usuário”);
System.out.println(“2- Cadastrar Livro”);
System.out.println(“3- Cadastrar Empréstimo”);
System.out.println(“4- Inserir Novo Ítem Ao Empréstimo”);
System.out.println(“5- Excluir Usuário”);
System.out.println(“6- Excluir Livro”);
System.out.println(“7- Excluir Empréstimo”);
System.out.println(“8- Excluir Um Ítem De Um Empréstimo”);
System.out.println(“9- Devolver Todos Os Livros de Um Empréstimo”);
System.out.println(“10- Devolver Um Livro do Empréstimo”);
System.out.println(“11- Pesquisar Livros Por Título”);
System.out.println(“12- Pesquisar Livros Por Autor”);
System.out.println(“13- Listar Todos Os Usuários”);
System.out.println(“14- Listar Todos Os Livros”);
System.out.println(“15- Listar Todos Os Empréstimos e Seus Ítens”);
System.out.println(“0- Sair do Programa”);
System.out.println("");
System.out.print("Digite sua opção: ");

  Scanner entrada  = new Scanner(System.in);
  Biblioteca biblioteca = new Biblioteca();
  String s1,s2,s3,s4 = null;

  boolean continuar=true;
    
      do {    
        switch (entrada.nextInt()) {
          case 1: //===================================================
                  System.out.println("Digite o nome do usuário: ");
                  s1=entrada.nextLine();
                  System.out.print("Digite o CPF do usuário: ");
                  s2=entrada.nextLine();
                  System.out.print("Digite o endereço do usuário: ");
                  s3=entrada.nextLine();
                  System.out.print("Digite o telefone do usuário: ");
                  Usuario usuario = new Usuario (s1,s2,s3,s4);
                  biblioteca.inserirUsuario(usuario);
                  System.out.print("Usuário adicionado!");
                  break;
          case 2: //====================================================
                               
          case 3: //====================================================
                  
          case 5: //====================================================
                    
          case 6: //====================================================
                
          case 7: //====================================================
          
          case 8: //====================================================
            
          case 9: //====================================================
            
          case 10: //====================================================
             
          case 11: //====================================================
            
          case 12: //====================================================
            
          case 13: //====================================================
            
          case 14: //====================================================
          
          case 15: //====================================================
                
          case 0:  //====================================================
                       
          default: //====================================================
                   System.out.println("Opção inválida.");break; }
        }while(continuar=true); 

}
}
[/code]

Classe Interface:
Método para apresentar um menu (interface de caracteres) com opções para:
cadastrar um novo usuario, cadastrar um novo livro, cadastrar um novo
empréstimo, inserir um novo item de empréstimo, excluir um usuario, excluir um
livro, excluir um empréstimo, excluir um item de empréstimo, devolver todos os
livros do empréstimo, devolver um livro do empréstimo, pesquisar livros por
título, pesquisar livros por autor, listar todos os usuarios, listar todos os livros,
listar todos os empréstimos e seus itens e sair do programa;
Método para cadastrar um novo usuario. Deve permitir que o usuário entre com
os dados do usuario a ser inserido;
Método para cadastrar um novo livro. Deve permitir que o usuário entre com os
dados do livro a ser inserido;
Método para cadastrar um novo empréstimo. Deve permitir que o usuário entre
com os dados do empréstimo a ser inserido e de cada um de seus itens.
Método para inserir um novo item de empréstimo a um empréstimo já existente.
Deve permitir que o usuário escolha o empréstimo e insira os dados do novo
item;
Método para excluir um usuario. Deve permitir que o usuário escolha o usuario a
ser excluído;
Método para excluir um livro. Deve permitir que o usuário escolha o livro a ser
excluído;
Método para excluir um empréstimo. Deve permitir que o usuário escolha o
empréstimo a ser excluído;
Método para excluir um item de empréstimo de um empréstimo já existente.
Deve permitir que o usuário escolha o empréstimo e o item a ser excluído;
Método para devolver todos os livros de um empréstimo. Deve permitir que o
usuário escolha o empréstimo a ser devolvido;
Método para devolver um livro de um empréstimo. Deve permitir que o usuário
escolha o empréstimo e o livro a ser devolvido;
Método para pesquisar livros por título. Deve permitir que o usuário entre com
parte do título do livro a ser pesquisado. Deve listar os dados de todos os livros
encontrados.
Método para pesquisar livros por autor. Deve permitir que o usuário entre com
parte do nome do autor do livro a ser pesquisado. Deve listar os dados de todos
os livros encontrados.
Método para listar todos os livros. Deve listar os dados de todos os livros;
Método para listar todos os empréstimos. Deve listar os dados de todos os
empréstimos com seus respectivos itens;
Método main para ler os dados armazenados em arquivo, apresentar o menu
principal e, antes de sair do programa, gravar os dados em arquivo.

switch (entrada.nextInt()) { case 1: //=================================================== System.out.println("Digite o nome do usuário: "); s1=entrada.nextLine();

aí parece está certo…mas, tenta primeiro receber o valor e coloca dentro do switch somente o valor.

default: //==================================================== System.out.println("Opção inválida.");break; } }while(continuar=true);

aí está errado, o certo ficaria

            }while(continuar==true);  

Só um comentário.
Variáveis booleanas dispensam a necessidade de comparação com ‘==’.

Veja:

[code]boolean var = true;
if (var == true) / if (var)

if (var == false) / if (!var)[/code]

Mostrar a similaridade á você. Portanto, isso é suficiente:

while(continuar) {}

Abraços.

Só mais um comentário. Conheço pouco da classe Scanner, pois praticamente não a uso (até hoje, nunca precisei dela). Mas já li vários tópicos onde explicam o motivo de usar exclusivamente nextLine(), independente se tu espera uma String ou um int, por exemplo. Se quiser, procure no GUJ, vai ter a tal da explicação. As vezes isso pode estar falhando no seu nextInt().

Abraços.

nel pelo que eu me lembre a nextLine(); pega o dado da linha inteira, ao contrario da next();, vamos supor eu ponho meu nome Carlos Henrique, a next pega só o carlos e a nextLine(); pega a linha toda, pelo oq o professor do curso falou foi isso =]. Se eu estiver errado alguém faça um comentário.
Pq vc não declara as strings com o nome do que vc ira fazer ? Ao inves de s1 poem nome e etc …

amigo eu acho que vc não tem necessidade de utilizar null nas s1,s2,s3,s4 e pelo que eu vi

System.out.print("Digite o endereço do usuário: "); s3=entrada.nextLine(); System.out.print("Digite o telefone do usuário: "); Usuario usuario = new Usuario (s1,s2,s3,s4);

quando vc pede o telefone do usuario vc não digita o s4=entrada.nextLine();

ficando assim

System.out.print("Digite o endereço do usuário: "); s3=entrada.nextLine(); System.out.print("Digite o telefone do usuário: "); s4=entrada.nextLine() Usuario usuario = new Usuario (s1,s2,s3,s4);

Porque aii vc estária passando os 4 parametros para dentro do construtor da class Usuario =]

Carlos, o que eu me referia é que, parece, que o nextInt(), por exemplo, pode pegar “sujeira”, quando identifica determinados caracteres.
Eu realmente não sei explicar, vou ver se depois consigo um tempinho para achar algum tópico explicando isso.

Abraços.

Ataa, foi mal entendi errado ):

O que acontece é o seguinte:

nextLine() pega a linha inteira até o delimitador de próxima linha.
os outros nexts (nextInt, next, nextLong … etc) apenas pegam o próximo token, é até possível passar uma regex como parâmetro.
Este token, por default não contém o delimitador.

Vamos dizer que o delimitador é \n. Quando vc escreve a opção do menu, a linha fica “1\n”.
Aí vc usa o nexInt(), que te retorna o 1. A linha ainda não está acabada. Quando vc tenta usar o nextLine(), ele pega o \n da linha que tava o “1\n”.
Não sei se deu para entender, a explicação ficou horrível ahahahah.

Enfim, uma opção para solucionar o problema é a seguinte:

do {      
            switch (Integer.parseInt(entrada.nextLine())) {  
              case 1: //===================================================  
                      System.out.println("Digite o nome do usuário: ");  
                      s1=entrada.nextLine();  
                      System.out.print("Digite o CPF do usuário: ");  
                      s2=entrada.nextLine();  
                      System.out.print("Digite o endereço do usuário: ");  
                      s3=entrada.nextLine();  
                      System.out.print("Digite o telefone do usuário: ");
                      s4=entrada.nextLine();  
                      Usuario usuario = new Usuario (s1,s2,s3,s4);  
                      biblioteca.inserirUsuario(usuario);  
                      System.out.print("Usuário adicionado!");  
                      break;

[quote=nel]Só um comentário.
Variáveis booleanas dispensam a necessidade de comparação com ‘==’.

Veja:

[code]boolean var = true;
if (var == true) / if (var)

if (var == false) / if (!var)[/code]

Mostrar a similaridade á você. Portanto, isso é suficiente:

while(continuar) {}

Abraços.[/quote]

Obrigado pela dica. Vou alterar essa parte aqui,

[quote=nel]Só mais um comentário. Conheço pouco da classe Scanner, pois praticamente não a uso (até hoje, nunca precisei dela). Mas já li vários tópicos onde explicam o motivo de usar exclusivamente nextLine(), independente se tu espera uma String ou um int, por exemplo. Se quiser, procure no GUJ, vai ter a tal da explicação. As vezes isso pode estar falhando no seu nextInt().

Abraços.[/quote]

Mas estou utilizando nextLine.

[quote=carloshsamaral]nel pelo que eu me lembre a nextLine(); pega o dado da linha inteira, ao contrario da next();, vamos supor eu ponho meu nome Carlos Henrique, a next pega só o carlos e a nextLine(); pega a linha toda, pelo oq o professor do curso falou foi isso =]. Se eu estiver errado alguém faça um comentário.
Pq vc não declara as strings com o nome do que vc ira fazer ? Ao inves de s1 poem nome e etc …

amigo eu acho que vc não tem necessidade de utilizar null nas s1,s2,s3,s4 e pelo que eu vi

System.out.print("Digite o endereço do usuário: "); s3=entrada.nextLine(); System.out.print("Digite o telefone do usuário: "); Usuario usuario = new Usuario (s1,s2,s3,s4);

quando vc pede o telefone do usuario vc não digita o s4=entrada.nextLine();

ficando assim

System.out.print("Digite o endereço do usuário: "); s3=entrada.nextLine(); System.out.print("Digite o telefone do usuário: "); s4=entrada.nextLine() Usuario usuario = new Usuario (s1,s2,s3,s4);

Porque aii vc estária passando os 4 parametros para dentro do construtor da class Usuario =]
[/quote]

Já corrigi. Havia esquecido o s4. Não declaro nomes porque usarei as strings em outras opções do case. As Strings não possuem uma única finalidade.
O null foi uma sugestão do Netbeans, também não entendi porque.

[quote=felipeaps]O que acontece é o seguinte:

nextLine() pega a linha inteira até o delimitador de próxima linha.
os outros nexts (nextInt, next, nextLong … etc) apenas pegam o próximo token, é até possível passar uma regex como parâmetro.
Este token, por default não contém o delimitador.

Vamos dizer que o delimitador é \n. Quando vc escreve a opção do menu, a linha fica “1\n”.
Aí vc usa o nexInt(), que te retorna o 1. A linha ainda não está acabada. Quando vc tenta usar o nextLine(), ele pega o \n da linha que tava o “1\n”.
Não sei se deu para entender, a explicação ficou horrível ahahahah.

Enfim, uma opção para solucionar o problema é a seguinte:

do { switch (Integer.parseInt(entrada.nextLine())) { case 1: //=================================================== System.out.println("Digite o nome do usuário: "); s1=entrada.nextLine(); System.out.print("Digite o CPF do usuário: "); s2=entrada.nextLine(); System.out.print("Digite o endereço do usuário: "); s3=entrada.nextLine(); System.out.print("Digite o telefone do usuário: "); s4=entrada.nextLine(); Usuario usuario = new Usuario (s1,s2,s3,s4); biblioteca.inserirUsuario(usuario); System.out.print("Usuário adicionado!"); break; [/quote]

Deu certo. Até entendi sua explicação, só não entendi muito bem o que fez pra contornar a situação.
E também surgiu um problema:

Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:470) at java.lang.Integer.parseInt(Integer.java:499) at biblioteca.iterface.Interface.main(Interface.java:44) Java Result: 1


Uma outra coisa. No construtor da Classe Biblioteca está assim:

public Biblioteca(){ usuarios = new ArrayList<Usuario>(); }

Sei que é uma dúvida muito idiota, mas porque na inicialização eu coloco o b[/b] depois de especificar o tipo de objeto?

Porque é a definição, suficiente saber isso.
Sobre a sua exceção, faça assim:

String s = scanner.nextLine(); //senão é vazia e possui somente números if (!s.trim.isEmpty() && s.trim().matches("\\d+")) { Integer num = Integer.parseInt(s.trim()); // faça o que quiser }

[quote=nel]Porque é a definição, suficiente saber isso.
Sobre a sua exceção, faça assim:

String s = scanner.nextLine(); //senão é vazia e possui somente números if (!s.trim.isEmpty() && s.trim().matches("\\d+")) { Integer num = Integer.parseInt(s.trim()); // faça o que quiser }[/quote]

Desculpe a ignorância, mas onde eu adicionaria essa parte que me passou?
Pode me falar mais dessa exceção que aconteceu?

Bom pessoal, eu mudei um pouco a classe. Está funcional. Parece que deu certo:

[code]package biblioteca.iterface;

import biblioteca.*;
import java.util.Scanner;
import java.lang.String;

/**

  • Classe Interface (interação com o usuário)
  • @author Jr Mendes
  • @version 1.0
    */

public class Interface {

public static void main(String[] args){

boolean continuar=true;
Biblioteca biblioteca = new Biblioteca();
Scanner entrada = new Scanner(System.in);

do {

   String s1,s2,s3,s4 = null;
     
   System.out.println(""); 
   System.out.println("");
   System.out.println("O que deseja fazer? ");
   System.out.println("");
   System.out.println("1- Cadastrar Usuário");
   System.out.println("2- Cadastrar Livro");
   System.out.println("3- Cadastrar Empréstimo");
   System.out.println("4- Inserir Novo Ítem Ao Empréstimo");
   System.out.println("5- Excluir Usuário");
   System.out.println("6- Excluir Livro");
   System.out.println("7- Excluir Empréstimo");
   System.out.println("8- Excluir Um Ítem De Um Empréstimo");
   System.out.println("9- Devolver Todos Os Livros de Um Empréstimo");
   System.out.println("10- Devolver Um Livro do Empréstimo");
   System.out.println("11- Pesquisar Livros Por Título");
   System.out.println("12- Pesquisar Livros Por Autor");
   System.out.println("13- Listar Todos Os Usuários");
   System.out.println("14- Listar Todos Os Livros");
   System.out.println("15- Listar Todos Os Empréstimos e Seus Ítens");
   System.out.println("0- Sair do Programa");
   System.out.println("");
   System.out.print("Digite sua opção: ");    

   int temp = Integer.parseInt(entrada.nextLine());
   
     switch (temp) {
       case 1: //===================================================
               System.out.print("Digite o nome do usuário: ");
               s1=entrada.nextLine();
               System.out.print("Digite o CPF do usuário: ");
               s2=entrada.nextLine();
               System.out.print("Digite o endereço do usuário: ");
               s3=entrada.nextLine();
               System.out.print("Digite o telefone do usuário: ");
               s4=entrada.nextLine();
               Usuario usuario = new Usuario (s1,s2,s3,s4);
               biblioteca.inserirUsuario(usuario);
               System.out.print("Usuário adicionado!");
               break;
       case 2: //====================================================
                            
       case 3: //====================================================
                  
       case 5: //====================================================
                    
       case 6: //====================================================
                
       case 7: //====================================================
          
       case 8: //====================================================
            
       case 9: //====================================================
            
       case 10: //====================================================
             
       case 11: //====================================================
            
       case 12: //====================================================
            
       case 13: //====================================================
            
       case 14: //====================================================
          
       case 15: //====================================================
                
       case 0:  //====================================================
                System.out.println("");
                System.out.println("Obrigado por utilizar o programa");
                System.out.println("");
                continuar=false;
                break;
       default: //====================================================
                System.out.println("Opção inválida.");
                break; 
     }
 }while(continuar); 

}
}
[/code]

Gostaria que alguém me explicasse um pouco sobre essas exceções que o Netbeans insistiu para serem colocadas nesse método de gravação (e no de leitura) de um arquivo:

public void gravarDadados(Biblioteca biblioteca) throws FileNotFoundException, IOException{ ObjectOutputStream objetoOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("Arquivo.obj"))); objetoOut.writeObject(biblioteca); objetoOut.close(); }

  • Outra coisa na qual eu estou precisando de ajuda é na construção de um método para excluir funcionários e livros da Biblioteca.
    Até aí tudo bem, mas eles só podem ser excluído não houver empréstimos que os envolva. Não consegui pensar numa forma de verificar se um livro está emprestado ou se um usuário tem um empréstimo ativo.

Então, o código que lhe passei seria nessa linha:

int temp = Integer.parseInt(entrada.nextLine());

Seria assim, no caso:

int temp = -1; String s = entrada.nextLine(); //senão é vazia e possui somente números if (!s.trim.isEmpty() && s.trim().matches("\\d+")) { temp = Integer.parseInt(s.trim()); } else { System.out.println("Digite somente número como opção"); }

Como o valor padrão é -1 e está no seu do-while, ele não vai entrar em nenhum dos ‘case’ e continuar no laço de repetição.
O método matches aplica um regex na sua String e retorna com um booleano. Eu apliquei o regex “\d+”, que em outro palavras, verifica se sua String contém exclusivamente digitos. “\d+” é igual a fazer “[0-9]+”, por exemplo.

[quote=kxmm]Gostaria que alguém me explicasse um pouco sobre essas exceções que o Netbeans insistiu para serem colocadas nesse método de gravação (e no de leitura) de um arquivo:

public void gravarDadados(Biblioteca biblioteca) throws FileNotFoundException, IOException{ ObjectOutputStream objetoOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("Arquivo.obj"))); objetoOut.writeObject(biblioteca); objetoOut.close(); }

  • Outra coisa na qual eu estou precisando de ajuda é na construção de um método para excluir funcionários e livros da Biblioteca.
    Até aí tudo bem, mas eles só podem ser excluído não houver empréstimos que os envolva. Não consegui pensar numa forma de verificar se um livro está emprestado ou se um usuário tem um empréstimo ativo.

[/quote]

Quando surgir dúvidas desse tipo, sempre leia o javadoc.

Leia o javadoc e vai entender o motivo das exceções.
Sobre a sua dúvida de verificar livro emprestado e usuário ativo, crie objetos que representem o usuário e o livro, pode usar variavéis booleanas que indicam se o livro x está emprestado ou não e se o usuário está ativo ou não, por exemplo.

Acho que consegui terminar o projeto. Ficou bem grande, o maior que já fiz até agora. Estou com medo de conter alguns erros, mas fica inviável postar as 6 classes aqui.
E também acho que passaria da boa vontade, pedir para analisarem o código.
Enfim, espero que esteja tudo certo, funcional. Agradeço todos que me ajudaram.

Vou só postar a classe Interface aqui. Se alguém quiser opinar em algo…
Novamente, obrigado.

[code]package biblioteca.iterface;

import biblioteca.;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.
;
import java.lang.String;

/**

  • Classe Interface (interação com o usuário)
  • @author Jr Mendes
  • @version 1.0
    */

public class Interface {

/**
* @param args
* @throws ParseException
* @throws FileNotFoundException
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ParseException, FileNotFoundException, IOException, ClassNotFoundException {

boolean continuar=true;
Biblioteca biblioteca = new Biblioteca();
Scanner entrada = new Scanner(System.in);

biblioteca.lerDados();

do {

   String s1,s2,s3,s4 = null;
   GregorianCalendar gc = new GregorianCalendar();      
   
   System.out.println(""); 
   System.out.println("");
   System.out.println("O que deseja fazer? ");
   System.out.println("");
   System.out.println("1- Cadastrar Usuário");
   System.out.println("2- Cadastrar Livro");
   System.out.println("3- Cadastrar Empréstimo");
   System.out.println("4- Inserir Novo Ítem Ao Empréstimo");
   System.out.println("5- Excluir Usuário");
   System.out.println("6- Excluir Livro");
   System.out.println("7- Excluir Empréstimo");
   System.out.println("8- Excluir Um Ítem De Um Empréstimo");
   System.out.println("9- Devolver Todos Os Livros de Um Empréstimo");
   System.out.println("10- Devolver Um Livro do Empréstimo");
   System.out.println("11- Pesquisar Livros Por Título");
   System.out.println("12- Pesquisar Livros Por Autor");
   System.out.println("13- Listar Todos Os Usuários");
   System.out.println("14- Listar Todos Os Livros");
   System.out.println("15- Listar Todos Os Empréstimos e Seus Ítens");
   System.out.println("0- Sair do Programa");
   System.out.println("");
   System.out.print("Digite sua opção: ");    

   /**
    * Essa parte do código irá se certificar que a opção digitada pelo usuário
    * seja um número e se certificará também da conversão da string para inteiro.
    * O uso de nextInteger() não foi realizado, pois dava erro devido ao "lixo" 
    * capturado pelo método (pulava pra receber outra entrada sem receber a anterior)
    */
   int temp = -1;  
   String s = entrada.nextLine();    
   if (!s.trim().isEmpty() && s.trim().matches("\\d+")) {    
     temp = Integer.parseInt(s.trim());       
   } 
 
     switch (temp) {
       case 1: //===================================================
               System.out.print("Digite o nome do usuário: ");
               s1=entrada.nextLine();
               System.out.print("Digite o CPF do usuário: ");
               s2=entrada.nextLine();
               System.out.print("Digite o endereço do usuário: ");
               s3=entrada.nextLine();
               System.out.print("Digite o telefone do usuário: ");
               s4=entrada.nextLine();
               Usuario usuario = new Usuario (s1,s2,s3,s4);
               biblioteca.inserirUsuario(usuario);
               System.out.print("Usuário adicionado!");
               break;
       case 2: //====================================================
               System.out.print("Digite o código do livro: ");
               s1=entrada.nextLine();
               System.out.print("Digite a quantidade de exemplares do livro: ");
               s2=entrada.nextLine();
               System.out.print("Digite o título do livro: ");
               s3=entrada.nextLine();
               System.out.print("Digite o(s) autor(es) do livro: ");
               s4=entrada.nextLine();
               Livro livro = new Livro (Integer.parseInt(s1),Integer.parseInt(s2),s3,s4);
               biblioteca.inserirLivro(livro);
               System.out.print("Livro adicionado!");
               break;             
       case 3: //====================================================
               System.out.print("Digite o nome do usuário: ");
               s1=entrada.nextLine();
               System.out.print("Digite a data de devolução: ");
               s2=entrada.nextLine();
               Emprestimo emprestimo = new Emprestimo(biblioteca.pesquisaUsuario(s1),biblioteca.stringGC(s2));
               biblioteca.inserirEmprestimo(emprestimo);
               do{
                 s3=null;
                 System.out.print("Digite o título do livro que será emprestado: ");
                 s3=entrada.nextLine();
                 itemEmprestimo item = new itemEmprestimo(biblioteca.pesquisaLivro(s3));
                 biblioteca.inserirItemEmprestimo(emprestimo,item);
                 System.out.print("Ok!");
                 System.out.print("Deseja adicionar outro livro ao empréstimo? (s ou n): ");
                 s4=entrada.nextLine();
               }while(s4.equals("s"));  
               break;
       case 5: //====================================================
               System.out.print("Digite o usuário do empréstimo correspondente: ");
               s1=entrada.nextLine();
               do{
                 s2=null;
                 System.out.print("Digite o título do livro que será emprestado: ");
                 s2=entrada.nextLine();
                 itemEmprestimo item = new itemEmprestimo(biblioteca.pesquisaLivro(s2));
                 biblioteca.inserirItemEmprestimo(biblioteca.pesquisaEmprestimo(s1),item);
                 System.out.print("Ok!");
                 System.out.print("Deseja adicionar outro livro ao empréstimo? (s ou n): ");
                 s4=entrada.nextLine();
               }while(s4.equals("s")); 
               break;
       case 6: //====================================================
               System.out.print("Digite o nome do usuário: ");
               s1=entrada.nextLine();
               biblioteca.excluirUsuario(biblioteca.pesquisaUsuario(s1));
               break;
       case 7: //====================================================
               System.out.print("Digite o título do livro: ");
               s1=entrada.nextLine();
               biblioteca.excluirLivro(biblioteca.pesquisaLivro(s1));
               break;
       case 8: //====================================================
               System.out.print("Digite o nome do usuário do qual o empréstimo será excluído: ");
               s1=entrada.nextLine();
               biblioteca.excluirEmprestimo(biblioteca.pesquisaEmprestimo(s1));
               break;
       case 9: //====================================================
               System.out.print("Digite o nome do usuário responsável pelo empréstimo: ");
               s1=entrada.nextLine();
               System.out.print("Digite o título do livro que deseja excluir do empréstimo: ");
               s2=entrada.nextLine();
               biblioteca.devolverItem(biblioteca.pesquisaEmprestimo(s1), biblioteca.pesquisaLivro(s2));
               break;
      case 10: //====================================================
               System.out.print("Digite o nome do usuário responsável pelo empréstimo a ser devolvido: ");
               s1=entrada.nextLine();
               biblioteca.devolverTodosItensEmprestimo(biblioteca.pesquisaEmprestimo(s1));
      case 11: //====================================================
               System.out.print("Digite o nome do usuário responsável pelo empréstimo a ser devolvido: ");
               s1=entrada.nextLine();
               System.out.print("Digite o título do livro que deseja devolver do empréstimo: ");
               s2=entrada.nextLine();
               ArrayList<itemEmprestimo> itensEmp = biblioteca.pesquisaEmprestimo(s1).getItens();
               for (int i=0;i<itensEmp.size()-1;i++){
                 if (biblioteca.pesquisaLivro(s2).equals(itensEmp.get(i).getLivro())){
                   biblioteca.devolverItem(biblioteca.pesquisaEmprestimo(s1),itensEmp.get(i).getLivro());    
                   System.out.print("Livro " + itensEmp.get(i).getLivro().getTitulo() + " devolvido com sucesso!" );
                 }
               }
      case 12: //====================================================
               System.out.print("Digite o título procurado: ");
               s1=entrada.nextLine();  
               biblioteca.pesquisaTitulo(s1);
               for (int i=0; i<biblioteca.pesquisaTitulo(s1).size()-1;i++){
                 System.out.println(biblioteca.pesquisaTitulo(s1).get(i).getTitulo());
               }
      case 13: //====================================================
               System.out.print("Digite o autor procurado: ");
               s1=entrada.nextLine();
               for (int i=0; i<biblioteca.pesquisaAutor(s1).size()-1;i++){
                 System.out.println(biblioteca.pesquisaAutor(s1).get(i).getAutores());
               }
      case 14: //====================================================
               for (int i=0; i<biblioteca.obterListaLivros().size()-1 ;i++){
                 System.out.println("Título: " + biblioteca.obterListaLivros().get(i).getTitulo());
                 System.out.println("Autor(es): " + biblioteca.obterListaLivros().get(i).getAutores());
                 System.out.println("Código: " + biblioteca.obterListaLivros().get(i).getCodLivro());
                 System.out.println("Quantidade de Exemplares: " + biblioteca.obterListaLivros().get(i).getQtdeExemplares());
               }
      case 15: //====================================================
               for (int i=0; i<biblioteca.obterListaEmprestimos().size()-1 ;i++){
                 System.out.println("Emprésimo Número: " + biblioteca.obterListaEmprestimos().get(i).getNumero());  
                 for (int j=0; j < biblioteca.obterListaEmprestimos().get(i).getItens().size()-1; j++){
                   System.out.println("Título: " + biblioteca.obterListaEmprestimos().get(i).getItens().get(j).getLivro().getTitulo());
                   System.out.println("Autor(es): " + biblioteca.obterListaEmprestimos().get(i).getItens().get(j).getLivro().getAutores());
                   System.out.println("Código: " + biblioteca.obterListaEmprestimos().get(i).getItens().get(j).getLivro().getCodLivro());
                   System.out.println("Quantidade de Exemplares: " + biblioteca.obterListaEmprestimos().get(i).getItens().get(j).getLivro().getQtdeExemplares());  
                 }    
               }      
       case 0:  //====================================================
                System.out.println("");
                System.out.println("Obrigado por utilizar o programa");
                System.out.println("");
                biblioteca.gravarDadados(biblioteca);
                System.out.println("Dados gravados em arquivo");
                continuar=false;
                break;
       default: //====================================================
                System.out.println("Opção inválida.");
                break; 
     }
 }while(continuar); 

}
}
[/code]

As orientações para a classe são:

[color=red]Classe Interface:
[/color]
#Método para apresentar um menu (interface de caracteres) com opções para:
cadastrar um novo usuario, cadastrar um novo livro, cadastrar um novo
empréstimo, inserir um novo item de empréstimo, excluir um usuario, excluir um
livro, excluir um empréstimo, excluir um item de empréstimo, devolver todos os
livros do empréstimo, devolver um livro do empréstimo, pesquisar livros por
título, pesquisar livros por autor, listar todos os usuarios, listar todos os livros,
listar todos os empréstimos e seus itens e sair do programa;
#Método para cadastrar um novo usuario. Deve permitir que o usuário entre com
os dados do usuario a ser inserido;
#Método para cadastrar um novo livro. Deve permitir que o usuário entre com os
dados do livro a ser inserido;
#Método para cadastrar um novo empréstimo. Deve permitir que o usuário entre
com os dados do empréstimo a ser inserido e de cada um de seus itens.
#Método para inserir um novo item de empréstimo a um empréstimo já existente.
Deve permitir que o usuário escolha o empréstimo e insira os dados do novo
item;
#Método para excluir um usuario. Deve permitir que o usuário escolha o usuario a
ser excluído;
#Método para excluir um livro. Deve permitir que o usuário escolha o livro a ser
excluído;
#Método para excluir um empréstimo. Deve permitir que o usuário escolha o
empréstimo a ser excluído;
#Método para excluir um item de empréstimo de um empréstimo já existente.
Deve permitir que o usuário escolha o empréstimo e o item a ser excluído;
#Método para devolver todos os livros de um empréstimo. Deve permitir que o
usuário escolha o empréstimo a ser devolvido;
#Método para devolver um livro de um empréstimo. Deve permitir que o usuário
escolha o empréstimo e o livro a ser devolvido;
#Método para pesquisar livros por título. Deve permitir que o usuário entre com
parte do título do livro a ser pesquisado. Deve listar os dados de todos os livros
encontrados.
#Método para pesquisar livros por autor. Deve permitir que o usuário entre com
parte do nome do autor do livro a ser pesquisado. Deve listar os dados de todos
os livros encontrados.
#Método para listar todos os livros. Deve listar os dados de todos os livros;
#Método para listar todos os empréstimos. Deve listar os dados de todos os
empréstimos com seus respectivos itens;
# Método main para ler os dados armazenados em arquivo, apresentar o menu
principal e, antes de sair do programa, gravar os dados em arquivo.

Acho que me precipitei. :lol:
Tá dando uma exceção por causa do método de ler arquivo.
O professor pede que ele leia no começo do método main, mas ainda não existe arquivo lá para ser lido.
Como resolver isso? E como não perder dados quando for gravar no final do programa?