Programa para gerir livros

Bom dia.

Estou a tentar desenvolver um programa simples para gerir livros usando listas. Tenho alguns problemas com a lógica a aplicar para resolver as questões que preciso de fazer. Gostaria que alguém me pudesse ajudar dando uma olhadela no código e dizendo se o que estou a fazer está no caminho certo ou se há sugestões para melhorar. Neste momento, a parte de inserir livros não está a funcionar correctamente. Há mais métodos que fiz para ver se funcionavam mas não fazem o que é pretendido no menu.

Agradeço desde já a ajuda.

Classe Menu

[code]package pacote;
import javax.swing.*;

public class Menu {
public static int Escolhas(){
int op;
do {
String a=“Menu”+
“\n1 - Inserir Livro”+
“\n2 - Listar Livros por ordem alfabética de título”+
“\n3 - Listar Livros de um autor por ordem alfabética de título”+
“\n4 - Listar Livros de uma Área por ordem alfabética de título” +
“\n5 - Listar Um Livro por ISBN”+
“\n6 - Eliminar Livro Por Título”+
“\n7 - Listar Autores com Livros”+
“\n0 - Sair”;
op=Integer.parseInt(JOptionPane.showInputDialog(a+"\nOpção? (0 a 7)"));
}
while ((op<0) || (op>7));
return op;
}

    public static void main(String[]args){
        ListaAutores la = new ListaAutores();
        ListaLivros ll = new ListaLivros();
        
        
        int opcao=Escolhas();
             while (opcao!=0){
                 switch(opcao){   
                 
                 // Inserir Livros
                 case 1:{
                     String titulo=JOptionPane.showInputDialog("Inserir título do Livro: ");
                     int ano = Integer.parseInt(JOptionPane.showInputDialog("Inserir ano do Livro: "));
                     String isbn=JOptionPane.showInputDialog("Inserir ISBN do Livro: ");
                     double preco= Double.parseDouble(JOptionPane.showInputDialog("Inserir preço do Livro: "));
                     String area=JOptionPane.showInputDialog("Inserir Área Científica do Livro: ");
                     String nome=JOptionPane.showInputDialog("Inserir Autor do Livro: ");
                     Livro novo = new Livro(titulo, ano, isbn, preco, area);
                     ll.insere(novo);
                     la.insere(nome);
                     break;
                 }  
                 
                 // Listar Livros por ordem alfabética de título
                 case 2:{
                     ll.lista();
                     break;
                 }  
                 
                  // Listar Livros de um autor por ordem alfabética de título
                 case 3:{  
                     la.listaAutores();                                        
                     break;
                 }    
         
                 //Listar Livros de uma Área por ordem alfabética de título
                 case 4:{
                     
                     break;
                 } 
                 
                 //Listar Um Livro por ISBN
                 case 5:{
                    
                     break;
                 }  
                    
                 //Eliminar Livro Por Título
                 case 6:{
                     
                     break;
                 }  
                 
               //Listar Autores com Livros
                 case 7:{
                     
                     break;
                 }  
                 
                 default: System.out.println("Opção não disponível. Escolha uma das opções!");
                 }               
                 opcao=Escolhas();             
             }       
    }

}[/code]

Classe Livro

[code]package pacote;

public class Livro {

private	String titulo;
private int ano;
private String isbn;
private double preco;
private String area;
private Autor primAutor;
private Livro proxLivro;

public Livro (String tituloT, int anoT, String isbnT, double precoT, String areaT){
	titulo = tituloT;
	ano = anoT;
	isbn = isbnT;
	preco = precoT;
	area = areaT;
}

public String getTitulo() {
	return titulo;
}

public void setTitulo(String titulo) {
	this.titulo = titulo;
}

public int getAno() {
	return ano;
}

public void setAno(int ano) {
	this.ano = ano;
}

public String getIsbn() {
	return isbn;
}

public void setIsbn(String isbn) {
	this.isbn = isbn;
}

public double getPreco() {
	return preco;
}

public void setPreco(double preco) {
	this.preco = preco;
}

public String getArea() {
	return area;
}

public void setArea(String area) {
	this.area = area;
}

public Livro getProxLivro() {
	return proxLivro;
}

public void setProxLivro(Livro proxLivro) {
	this.proxLivro = proxLivro;
}

}
[/code]

Classe Autor

[code]package pacote;

public class Autor {

private String nome;
private Autor proxAutor;

public Autor getProxAutor() {
	return proxAutor;
}

public void setProxAutor(Autor proxAutor) {
	this.proxAutor = proxAutor;
}

private Livro primLivro;

public Autor (String nomeT){
	
	nome = nomeT;
	
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

}
[/code]

Classe ListaLivros

[code]package pacote;
import javax.swing.*;

public class ListaLivros {
private Livro primLivro;

public ListaLivros(){
    primLivro = null;
}

public void insere(Livro novo){
    
    if (primLivro == null){
        primLivro=novo;
    }
    else {
        if (primLivro.getTitulo().compareTo(novo.getTitulo()) < 0){
            novo.setProxLivro(primLivro);
            primLivro = novo;
        }
        else {
            Livro temp = primLivro.getProxLivro();
            Livro anteriorTemp = null;        
            while (temp != null && temp.getTitulo().compareTo(novo.getTitulo()) < 0){
                anteriorTemp = temp;
                temp = temp.getProxLivro();
            }
            
            novo.setProxLivro(temp);
            anteriorTemp.setProxLivro(novo);
        }
    }
}

public Livro pesquisa(String titulo){
    Livro temp = primLivro;
    Livro posL = temp;
    if (temp!=null) {
        JOptionPane.showMessageDialog(null,temp.getTitulo().compareTo(titulo));
        while (temp.getTitulo().compareTo(titulo)!=0 && temp.getProxLivro()!= null)
        temp = temp.getProxLivro();
        
        if(temp.getTitulo().compareTo(titulo)==0){    
            JOptionPane.showMessageDialog(null,temp.getTitulo());
            JOptionPane.showMessageDialog(null,"O nome " + titulo + " existe");
            return posL;
        }
    else
        JOptionPane.showMessageDialog(null,"O nome " + titulo + " Não existe");
        return posL;
    }
    else
        JOptionPane.showMessageDialog(null,"Vazia!");
    return posL;
}

public void lista(){
    Livro temp = primLivro;
    String x="";
    while (temp != null){
        x=x+"Título: "+temp.getTitulo()+"\n Ano: "+temp.getAno()+"\n ISBN: "+temp.getIsbn()+"\n Preço: "+temp.getPreco()+"\n Área Científica: "+temp.getArea()+"\n";
        temp= temp.getProxLivro();
    }
    JOptionPane.showMessageDialog(null, x);    
}

}
[/code]

Classe ListaAutores

[code]package pacote;
import javax.swing.*;

public class ListaAutores {
private Autor primAutor;

public ListaAutores(){
    primAutor=null;
}

public void insere(String nome){
        Autor novo = new Autor(nome);
        if (primAutor == null){
            novo.setNome(nome);
            primAutor=novo;
        }
        else {
            if (primAutor.getNome().compareTo(nome) > 0){
                novo.setProxAutor(primAutor);
                primAutor = novo;
            }
            else {
                Autor temp = primAutor;
                Autor anteriorTemp = null;        
                while (temp != null && temp.getNome().compareTo(nome) < 0){
                    anteriorTemp = temp;
                    temp = temp.getProxAutor();
                }
                novo.setProxAutor(temp);
                anteriorTemp.setProxAutor(novo);
            }
        }
    }

public Autor pesquisa(String nome){
    Autor temp = primAutor;
    Autor posA = temp;
    if (temp!=null) {
        // JOptionPane.showMessageDialog(null,temp.getNome().compareTo(nome));
        while (temp.getNome().compareTo(nome)!=0 && temp.getProxAutor()!= null)
        temp = temp.getProxAutor();
        
        if(temp.getNome().compareTo(nome)==0){    
            //JOptionPane.showMessageDialog(null,temp.getNome());
            JOptionPane.showMessageDialog(null,"O nome " + nome + " existe");
            return posA;
        }
    else
        JOptionPane.showMessageDialog(null,"O nome " + nome + " Não existe");
        return posA;
    }
    else
        JOptionPane.showMessageDialog(null,"Vazia!");
        return posA;
}

public void listaAutores(){
    Autor temp = primAutor;
    String x="";
    while (temp != null){
        x=x+temp.getNome()+"\n";
        temp= temp.getProxAutor();
    }
    JOptionPane.showMessageDialog(null, x);        
}

}[/code]

Qual o erro que esta dando no inserir livro?

Obrigado pela resposta, rockstorm.

Neste momento, insere o 1º livro mas depois não insere o 2º. Ou, pelo menos, não aparece quando tento listar…

Ele gera alguma excessão quando voce tenta inserir o segundo livro? Quando você diz inserir, esta sendo inserido onde os livros?

O problema é que, não sei porquê, umas vezes que tento inserir um livro (juntá-lo à ListaLivros), o programa funciona. Outras vezes, dá o erro

Exception in thread "main" java.lang.NullPointerException at pacote.ListaLivros.insere(ListaLivros.java:30) at pacote.Menu.main(Menu.java:41)

Outra coisa: quando funciona e tento listar, não está por ordem alfabética de título. Já listar autores, onde o código é o mesmo (eu sei que não está pedido no menu mas foi um teste que quis fazer) funciona perfeitamente. E não percebo porquê…

Ninguém?

Não li todo seu código pq está grande… =P

Olha a mensagem de erro. Você está chamando um método e passando um valor null. “ListaLivros.java:30”

Esse tem que ser seu ponto de partida. Ou trate seu método para aceitar valor null.

Obrigado pela resposta.

Isto anda a dar-me uma dor de cabeça… Bem, a verdade é que desisti da abordagem que estava a ter e tentei uma nova. Assim, já consigo fazer as 4 primeiras funcionalidades. No resto é que precisava de alguma ajuda.

Sendo assim, aqui vai o código que tenho neste momento.

Classe Menu:

[code]package pacote;

import javax.swing.JOptionPane;

public class Menu {

/**
 * @param args
 */
public static void main(String[] args)
{
    String menu="Menu"+ 
	   "\n1 - Inserir Autor"+
       "\n2 - Inserir Livro"+
       "\n3 - Listar Livros por ordem alfabética de título"+ 
       "\n4 - Listar Livros de um autor por ordem alfabética de título"+
       "\n5 - Listar Livros de uma Área por ordem alfabética de título" +
       "\n6 - Listar Um Livro por ISBN"+  
       "\n7 - Eliminar Livro Por Título"+
       "\n8 - Listar Autores com Livros"+
       "\n0 - Sair";
    int op;
    ListaUni lista= new ListaUni();
    do
    {
        op=Integer.parseInt(JOptionPane.showInputDialog(menu));
    }
    while(op<0 || op>8);
   
    while(op!=0)
    {
        switch(op)
        {
            case 1:
            {
                String nome=JOptionPane.showInputDialog("Introduza o nome do Autor:");
                lista.insere(nome);
                break;
                }
            
            case 2:
            {
                String nome=JOptionPane.showInputDialog("Introduza o nome do Autor:");
                Autor resPesq=lista.pesquisa(nome);
               
                if(resPesq!=null)
                {
                    String titulo=JOptionPane.showInputDialog("Introduza o título:");
                    String isbn=JOptionPane.showInputDialog("Introduza o ISBN:");
                    String area=JOptionPane.showInputDialog("Introduza a área científica:");
                    int ano = Integer.parseInt(JOptionPane.showInputDialog("Inserir ano do Livro:"));
                    double preco= Double.parseDouble(JOptionPane.showInputDialog("Inserir preço do Livro:"));
                    resPesq.insereL(titulo,isbn,area,ano,preco);
                }
                break;
            }
            
            case 3:
            {
                JOptionPane.showMessageDialog(null,lista.listarTudo());
                break;
            }
            
            case 4:
            {
                String nome=JOptionPane.showInputDialog("Introduza o nome do Autor");
                Autor resPesq=lista.pesquisa(nome);
                if(resPesq!=null)
                {
                    JOptionPane.showMessageDialog(null,resPesq.listar());
                }
                break;
            }
            
            case 5:
            {
           
                }
                break;
            }
            
        }
        do
        {
            op=Integer.parseInt(JOptionPane.showInputDialog(menu));
        }
        while(op<0 || op>8);
    }

}

[/code]

Classe Livro:

[code]package pacote;

public class Livro
{
private String titulo;
private String isbn;
private String area;
private int ano;
private double preco;

private Autor primAutor;
private Livro prox;
private Livro ant;

public Livro(String titulo,String isbn,String area,int ano,double preco)
{
	this.titulo=titulo;
	this.isbn=isbn;
	this.area=area;
	this.ano=ano;
	this.preco=preco;      
}

public String getTitulo() {
	return titulo;
}

public void setTitulo(String titulo) {
	this.titulo = titulo;
}

public String getIsbn() {
	return isbn;
}

public void setIsbn(String isbn) {
	this.isbn = isbn;
}

public String getArea() {
	return area;
}

public void setArea(String area) {
	this.area = area;
}

public int getAno() {
	return ano;
}

public void setAno(int ano) {
	this.ano = ano;
}

public double getPreco() {
	return preco;
}

public void setPreco(double preco) {
	this.preco = preco;
}

public Livro getProx()
{
	return prox;
}

public void setProx(Livro prox)
{
	this.prox = prox;
}

public Livro getAnt()
{
	return ant;
}

public void setAnt(Livro ant)
{
	this.ant = ant;
}

public Autor getPrimAutor() {
	return primAutor;
}

public void setPrimAutor(Autor primAutor) {
	this.primAutor = primAutor;
}

}[/code]

Classe Autor:

[code]package pacote;

public class Autor
{
private String nome;
private Autor prox;
private Livro cab;
private Livro primLivro;

public Autor(String nome)
{
    this.nome=nome;
    cab= new Livro(null,null, null, 0, 0);
    cab.setProx(cab);
    cab.setAnt(cab);
}

public Autor getProx()
{
    return prox;
}

public void setProx(Autor prox)
{
    this.prox = prox;
}

public String getNome()
{
    return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public Livro getCab() {
	return cab;
}

public void setCab(Livro cab) {
	this.cab = cab;
}

public Livro getPrimLivro() {
	return primLivro;
}

public void setPrimLivro(Livro primLivro) {
	this.primLivro = primLivro;
}

public void insereL(String titulo,String isbn,String area,int ano,double preco)
{
    Livro novoP= new Livro(titulo,isbn,area,ano,preco);
    Livro temp= cab.getProx();
   
    while(temp!=cab && titulo.compareTo(temp.getTitulo())>0)
    {
        temp=temp.getProx();
       
    }
    novoP.setProx(temp);
    novoP.setAnt(temp.getAnt());
    temp.getAnt().setProx(novoP);
    temp.setAnt(novoP);
}

public String listar()
{
    String listagem="";
    Livro temp=cab.getProx();
   
    while(temp!=cab)
    {
        listagem+="Título: "+temp.getTitulo()+"\n"+"ISBN: "+temp.getIsbn()+"\n"+"Área Científica: "+temp.getArea()+"\n"+"Ano: "+temp.getAno()+"\n"+"Preço: "+temp.getPreco()+"\n\n";
        temp=temp.getProx();
    }
    return listagem;
}

}

[/code]

Classe ListaUni:

[code]package pacote;

import javax.swing.JOptionPane;

public class ListaUni
{
private Autor prim;
private Livro primL;

public void insere(String nome)
{
    Autor novoT= new Autor(nome);
   
    if(prim==null)
    {
        prim = novoT;
    }
    else
    {
        novoT.setProx(prim);
        prim=novoT;
    }
}

public String listarTudo()
{
    Autor temp=prim;
    String listagem="";
   
    while(temp!=null)
    {
        listagem+="Livros de: "+temp.getNome()+"\n\n"+temp.listar()+"\n\n";
        temp=temp.getProx();
    }
    return listagem;
}

public Autor pesquisa(String nome)
{
    Autor temp=prim;
   
    while(temp!=null && nome.compareTo(temp.getNome())!=0)
    {
        temp=temp.getProx();
    }
    return temp;
   
}

public Livro pesquisaArea(String area){
    Livro temp = primL;
    Livro posL = temp;
    if (temp!=null) {
        JOptionPane.showMessageDialog(null,temp.getArea().compareTo(area));
        while (temp.getArea().compareTo(area)!=0 && temp.getProx()!= null)
        temp = temp.getProx();
        
        if(temp.getArea().compareTo(area)==0){    
            JOptionPane.showMessageDialog(null,temp.getArea());
            JOptionPane.showMessageDialog(null,"A área " + area + " existe");
            return posL;
        }
    else
        JOptionPane.showMessageDialog(null,"A área " + area + " não existe");
        return posL;
    }
    else
        JOptionPane.showMessageDialog(null,"Vazia!");
    return posL;
}

}

[/code]

Penso que se me puderem ajudar com esta pesquisa por àrea, consigo tratar do resto.

Desde já, obrigado.