Java.lang.NullPointerException

Boa noite a todos do GUJ, estou fazendo uma pequena agenda em RMI e quando tento adicionar algum valor no meu banco aparecesse este erro ai, abaixo está a classe servidor que está dando esse erro.

package agendarmi;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.Naming;
import java.util.ArrayList;

public class servidor extends UnicastRemoteObject implements AgendaInterface {
    
    public servidor() throws RemoteException
    {
        super();
    }

    //Metodo para adicionar os contatos
    public String cadastrar(Contato c1) throws RemoteException{
        String msg = "";
        try
        {
            operacoes operacao = new operacoes();
            c1.setNome(operacao.getContato().getNome());
            c1.setTelefone(operacao.getContato().getTelefone());
            c1.setEmail(operacao.getContato().getEmail());
            c1.setApelido(operacao.getContato().getApelido());
            ContatoDao dao = new ContatoDao();
            dao.adiciona(c1);
            System.out.println("Adicionado com Sucesso!");
            msg = "Ok";
        } catch (Exception ex) {
            System.out.println("Não foi possivel cadastrar " + ex);
            msg = "Erro";
        }
         return msg;
    }
	
    
    //Metodo principal
    public static void main(String[] args)
    {
        try
        {
            Naming.rebind("rmi://localhost/ServidorAgenda", new servidor());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

}

E aqui está a classe que uso para fazer a operação de inclusão

package agendarmi;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class ContatoDao {

    private Connection conexao;

    public ContatoDao() throws SQLException {
        this.conexao = CriaConexao.getConexao();
    }

    public void adiciona(Contato c1) throws SQLException {
        //Prepara a Conexao
        String sql = "INSERT INTO agenda (nome, telefone, email, apelido)" +
                "VALUES (?,?,?,?)";
        java.sql.PreparedStatement stmt = conexao.prepareStatement(sql);

        //Seta os valores
        stmt.setString(1, c1.getNome());
        stmt.setString(2, c1.getTelefone());
        stmt.setString(3, c1.getEmail());
        stmt.setString(4, c1.getApelido());

        //Executa o codigo SQL
        stmt.execute();
        stmt.close();

    }
}

Aparentemente tudo parece está certo, aonde que estou errando ?!

tá dando erro aonde? … nessa linha aqui? c1.setNome(operacao.getContato().getNome());

Sim está nessa linha ai…

Eu removi os packages de minhas classes. e entao para executar elas não preciso mais ficar indicando o nome do package.

Então executo tudo normal da seguinte maneira abaixo:

1º Prompt

[code]javac *.java

rmic servidor

rmiregistry[/code]

2º Prompt

java servidor

3º prompt

java AgendaForms

Então tudo ocorre certo ai, mais quando vou mandar adicionar algum contato por exemplo aparece a seguinte mensagem de ERRO

java.lang.NullPointerException[color=red] [/color]

Pelo que eu já e entendi isso acontece quando estou tentando acessar algum objeto que tenha valor nulo, mais já olhei meu codigo de cima abaixo e nao consigo ver esse valor nulo, abaixo está o codigo do meu servidor mais o meu contatoDao

Servidor

[code]import java.rmi.;
import java.rmi.server.
;
import java.rmi.Naming;
import java.util.ArrayList;

public class servidor extends UnicastRemoteObject implements AgendaInterface {

public servidor() throws RemoteException
{
    super();
}

//Metodo para adicionar os contatos
public String cadastrar(Contato c1) throws RemoteException{
    String msg = "";
    try
    {
        operacoes operacao = new operacoes();
        c1.setNome(operacao.getContato().getNome());
        c1.setTelefone(operacao.getContato().getTelefone());
        c1.setEmail(operacao.getContato().getEmail());
        c1.setApelido(operacao.getContato().getApelido());
        ContatoDao dao = new ContatoDao();
        dao.adiciona(c1);
        System.out.println("Adicionado com Sucesso!");
        msg = "Ok";
    } catch (Exception ex) {
        System.out.println("Não foi possivel cadastrar " + ex);
        msg = "Erro";
    }
     return msg;
}

//Metodo principal
public static void main(String[] args)
{
    try
    {
        Naming.rebind("rmi://localhost/ServidorAgenda", new servidor());
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

}[/code]

ContatoDao

[code]import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class ContatoDao {

private Connection conexao;

public ContatoDao() throws SQLException {
    this.conexao = CriaConexao.getConexao();
}

public void adiciona(Contato c1) throws SQLException {
    //Prepara a Conexao
    String sql = "INSERT INTO agenda (nome, telefone, email, apelido)" + "VALUES (?,?,?,?)";
    java.sql.PreparedStatement stmt = conexao.prepareStatement(sql);

    //Seta os valores
    stmt.setString(1, c1.getNome());
    stmt.setString(2, c1.getTelefone());
    stmt.setString(3, c1.getEmail());
    stmt.setString(4, c1.getApelido());

    //Executa o codigo SQL
    stmt.execute();
    stmt.close();

}

}[/code]

Então aonde que estou errando ?!

Muito provavelmente o objeto operacao.getContato()( O Contato da Operacao ) está nulo
Por isso quando vc pega o nome do contato da operação, dá nullpointerexpcetion

Para verificar adicione esse if para poder ver

if ( operacao.getContato == null )
{
System.out.println("Contato está nulo");
}

Adicione antes da linha que contem o código

c1.setNome(operacao.getContato().getNome());  

Só uma explicação maior:

NullPointerExceptions só acontecem em uma situação:

Pessoa p1 = null; // objeto está nulo

// você tentar chamar um atributo do objeto nulo
System.out.println(p1.nome); // gera NullPointerException
//ou método dele.
System.out.println(p1.getNome());  // gera NullPointerException

O mesmo vale para todo objeto dentro desse objeto

p1 = new Pessoa(); 
p1.nome = null; // nome está nulo

System.out.println(p1.nome.toUpperCase()); // gera NullPointerException
System.out.println(p1.getNome().toUpperCase());  // gera NullPointerException

Explicação TLDR:

  • um dos teus objetos está nulo.

Olá galera obrigado pela ajuda conseguir ajeitar está parte deixando o codigo da seguinte forma.

public String cadastrar(Contato c1) throws RemoteException{ String msg = ""; try { ContatoDao dao = new ContatoDao(); dao.adiciona(c1); System.out.println("Adicionado com Sucesso!"); msg = "Ok"; } catch (Exception ex) { System.out.println("Nao foi possivel cadastrar!\n"); ex.printStackTrace(); msg = "Erro"; } return msg; }

Como dá pra reparar removi tudo que tinha operacao.

Mais agora veio-me uma outra duvida, como que faço para chamar um metodo de listar dentro do meu arquivo servidor ?!

Na minha classe ContatoDao onde está meus metodos de inserir,altera, listar e excluir, o inserir por exemplo está da seguinte forma

[code]public void adiciona(Contato c1) throws SQLException {
//Prepara a Conexao
String sql = “INSERT INTO agenda (nome, telefone, email, apelido)” + “VALUES (?,?,?,?)”;
java.sql.PreparedStatement stmt = conexao.prepareStatement(sql);

    //Seta os valores
    stmt.setString(1, c1.getNome());
    stmt.setString(2, c1.getTelefone());
    stmt.setString(3, c1.getEmail());
    stmt.setString(4, c1.getApelido());

    //Executa o codigo SQL
    stmt.execute();
    stmt.close();

}[/code]

E a forma como ela está no servidor está da seguinte forma abaixo

public String cadastrar(Contato c1) throws RemoteException{ String msg = ""; try { ContatoDao dao = new ContatoDao(); dao.adiciona(c1); System.out.println("Adicionado com Sucesso!"); msg = "Ok"; } catch (Exception ex) { System.out.println("Nao foi possivel cadastrar!\n"); ex.printStackTrace(); msg = "Erro"; } return msg; }

O meus listar dentro do ContatoDao está assim:

[code]public List getLista(String nome) throws SQLException {
String sql = “SELECT * FROM agenda WHERE nome like ? order by nome”;
java.sql.PreparedStatement stmt = this.conexao.prepareStatement(sql);
stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();

    List<Contato> minhaLista = new ArrayList<Contato>();

    while (rs.next()) {
        Contato c1 = new Contato();
        c1.setId(Long.valueOf(rs.getString("id")));
        c1.setNome(rs.getString("nome"));
        c1.setTelefone(rs.getString("telefone"));
        c1.setEmail(rs.getString("email"));
        c1.setApelido(rs.getString("apelido"));
        minhaLista.add(c1);
    }

    rs.close();
    stmt.close();
    return minhaLista;
}[/code]

Como que eu poderia representar este codigo dentro do meu arquivo servidor ?!

Defina o método de listar na sua interface (AgendaInterface) e implemente-o na sua classe Servidor. Ele deve fazer a consulta ao banco via DAO e retornar um List (que vai para o cliente via RMI).

Tentei fazer da seguinte forma, mais está dando errado.

Na minha classe ContaoDao ficou assim

[code]public List getLista(Contato c1) throws SQLException {
String sql = “SELECT * FROM agenda order by nome”;
java.sql.PreparedStatement stmt = this.conexao.prepareStatement(sql);
//stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();

    List<Contato> minhaLista = new ArrayList<Contato>();

    while (rs.next()) {
        //Contato c1 = new Contato();
        c1.setId(Long.valueOf(rs.getString("id")));
        c1.setNome(rs.getString("nome"));
        c1.setTelefone(rs.getString("telefone"));
        c1.setEmail(rs.getString("email"));
        c1.setApelido(rs.getString("apelido"));
        minhaLista.add(c1);
    }

    rs.close();
    stmt.close();
    return minhaLista;
}[/code]

No meu servidor ficou assim

public ArrayList mostrar(Contato c1) throws RemoteException { try { ContatoDao dao = new ContatoDao(); dao.getLista(c1); }catch (Exception ex){ System.out.println("Nao foi possivel listar!\n"); ex.printStackTrace(); } return null; }

E na minha classe cliente ficou assim

[code]protected void listar() throws SQLException {
try {
Contato c1 = new Contato();

            AgendaInterface ai = (AgendaInterface) Naming.lookup("rmi://localhost/ServidorAgenda");
            contato = ai.mostrar(c1);
            mostraResultados(contato);

         } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro no servidor, tente mais tarde.\n" );
       e.printStackTrace();
         }

}[/code]

E está dando dois erros o primeiro quando executo o javac *.java aparece o seguinte erro, mais mesmo aparecendo esse erro tudo executa perfeitamente.

Note: AgendaForms.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.

O erro que aparece quando mando lista

java.lang.NullPointerException at AgendaForms.mostraResultados(AgendaForms.java:469) at AgendaForms.listar(AgendaForms.java:445) at AgendaForms.jBpesquisaActionPerformed(AgendaForms.java:314) at AgendaForms.access$200(AgendaForms.java:10) at AgendaForms$3.actionPerformed(AgendaForms.java:137) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6237) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6002) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4604) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4434) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4434) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Aonde que estou errando em meu código para aparecer este erro ?! Té mais.

[code]public List getLista(Contato c1) throws SQLException {
String sql = “SELECT * FROM agenda order by nome”;
java.sql.PreparedStatement stmt = this.conexao.prepareStatement(sql);
//stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();

    List<Contato> minhaLista = new ArrayList<Contato>();

    while (rs.next()) {
        //Contato c1 = new Contato();
        c1.setId(Long.valueOf(rs.getString("id")));
        c1.setNome(rs.getString("nome"));
        c1.setTelefone(rs.getString("telefone"));
        c1.setEmail(rs.getString("email"));
        c1.setApelido(rs.getString("apelido"));
        minhaLista.add(c1);
    }

    rs.close();
    stmt.close();
    return minhaLista;
}[/code]
  1. Se c1 for null, vai dar NullPointerException em c1.setId
  2. Você não está instanciando um novo objeto dentro do loop while(rs.next()). Quando o método retornar esta lista, você vai ver N elementos duplicados dentro dela, com o valor da última linha retornada do select.

public ArrayList mostrar(Contato c1) throws RemoteException { try { ContatoDao dao = new ContatoDao(); dao.getLista(c1); }catch (Exception ex){ System.out.println("Nao foi possivel listar!\n"); ex.printStackTrace(); } return null; }
3) O método nunca retorna a lista que você pediu. Ele só está retornando null. Dica: Nunca retorne nulos quando for retornar coleções, retorne uma coleção instanciada e vazia.
4) O método está declarado para retornar um ArrayList, você deveria estar retornando um List de Contatos.

[code]protected void listar() throws SQLException {
try {
Contato c1 = new Contato();

            AgendaInterface ai = (AgendaInterface) Naming.lookup("rmi://localhost/ServidorAgenda");
            contato = ai.mostrar(c1);
            mostraResultados(contato);

         } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro no servidor, tente mais tarde.\n" );
       e.printStackTrace();
         }

}[/code]
5) O método mostrar não retorna um Contato, ele retorna uma List.

[quote]E está dando dois erros o primeiro quando executo o javac *.java aparece o seguinte erro, mais mesmo aparecendo esse erro tudo executa perfeitamente.

Note: AgendaForms.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.[/quote]
Isto não é um erro, é um aviso. Acontece por causa do 4º item que citei.

[quote]O erro que aparece quando mando lista

[code]java.lang.NullPointerException
at AgendaForms.mostraResultados(AgendaForms.java:469)

[/code][/quote]
O stacktrace aponta que o NullPointerException aconteceu no arquivo AgendaForms.java, na linha 469, dentro do método mostrarResultados da classe AgendaForms.

Fiz algumas alterações em meu código e o deixei assim:

ContatoDao.java

[code]public List getLista() throws SQLException {
String sql = “SELECT * FROM agenda order by nome”;
java.sql.PreparedStatement stmt = this.conexao.prepareStatement(sql);
//stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();

    List<Contato> minhaLista = new ArrayList<Contato>();

    while (rs.next()) {
        Contato c1 = new Contato();
        c1.setId(Long.valueOf(rs.getString("id")));
        c1.setNome(rs.getString("nome"));
        c1.setTelefone(rs.getString("telefone"));
        c1.setEmail(rs.getString("email"));
        c1.setApelido(rs.getString("apelido"));
        minhaLista.add(c1);
    }

    rs.close();
    stmt.close();
    return minhaLista;
}[/code]

Caso eu não use o servidor para listar meus contato o codigo abaixo é o suficiente para lista-los dentro da classe cliente, mais o que devo utilizar dele para levar pro servidor ?!

[code]ContatoDao dao = new ContatoDao();
contato = dao.getLista();
mostraResultados(contato);
}

private void mostraResultados(List<Contato> contato) {
    desabilitaDados();
    jBalterar.setEnabled(true);
    jBexcluir.setEnabled(true);
    jBsalvar.setEnabled(false);
    jBlimpar.setEnabled(false);

	String[] linha = new String[]{null, null, null, null, null};
	for (int i = 0; i < contato.size(); i++) {
		tmContato.addRow(linha);
		tmContato.setValueAt(contato.get(i).getId(), i, 0);
		tmContato.setValueAt(contato.get(i).getNome(), i, 1);
		tmContato.setValueAt(contato.get(i).getTelefone(), i, 2);
		tmContato.setValueAt(contato.get(i).getEmail(), i, 3);
		tmContato.setValueAt(contato.get(i).getApelido(), i, 4);
	}
}[/code]

[quote=Bruno Laturner]

  1. Se c1 for null, vai dar NullPointerException em c1.setId[/quote]

Então o que devo fazer para o c1.setId não dar NullPointerException

E aqui o que devo fazer para ela retornar todos os valores que eu tenha cadastrado ?!

O meu novo metodo no servidor ficou assim:

public ArrayList mostrar() throws RemoteException { String msg = ""; try { ContatoDao dao = new ContatoDao(); dao.getLista(); msg = "Ok"; }catch (Exception ex){ System.out.println("Nao foi possivel listar!\n"); ex.printStackTrace(); msg = "Erro"; } //return null; }

O que devo retornar no lugar do null ?!

No meu cliente o codigo ficou assim agora:

[code]public void listar() throws SQLException {
try {
AgendaInterface ai = (AgendaInterface) Naming.lookup(“rmi://localhost/ServidorAgenda”);
contato = ai.mostrar();
mostraResultados(contato);

         } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro no servidor, tente mais tarde.\n" );
      e.printStackTrace();
         }

}[/code]

Muito obriagado pelas dicas.

Afff… enviei sem querer duas vezes a mesma coisa…

Antes de mais nada, acho que você deveria rever seus conceitos de orientação a objetos e a parte básica de Java. Parece que você está tentando aprender por tentativa e erro - e por uma parte mais avançada, o RMI - e isso não é legal.

[quote=jjrc]

Instanciar o objeto c1 antes do uso.

  1. Criar um List (a implementação pode ser um ArrayList).
  2. Fazer a consulta ao banco.
  3. Iterar no ResultSet.
  4. Para cada entrada no ResultSet:
    4.1. Criar um novo contato (isso irá solucionar o problema 1).
    4.2. Definir seus atributos (através dos setters).
    4.3. Adicionar o contato à lista.
  5. Fechar o ResultSet (o mais correto é fazer isso dentro de um bloco finally).
  6. Retornar a lista criada contendo os contatos (se ocorrer alguma exceção, ela deve ser lançada e, nesse caso, nada será retornado).

O List que você persistiu do banco. Faça assim:

public List<Contato> mostrar() throws RemoteException {
	try {                                               
		return dao.getLista();                          
	} catch (Exception ex) {                            
		ex.printStackTrace();                           
		return Collections.emptyList();                 
	}                                                   

Outra coisa, você não precisa criar um objeto ContatoDAO para cada método: use o mesmo (torne-o uma variável de instância e instancie-o no construtor).

O problema 4 citado pelo Bruno Laturner se resolverá se você usar a assinatura de método que eu postei acima. Mas no código que você postou parece ter outro problema: de que tipo é a variável contato nesse seu último trecho? Lembre-se que o método mostrar() retorna um List e não um Contato.

marcobiscaro2112,

Eu já vi java e fazia um bom tempo que eu nao programava em java, preferir me dedicar a PHP, então o professor na facul… resolveu cobrar java em uma disciplina e como o tempo é pouco pra voltar e estudar tudo novamente, acabo forçando-me a fazer por meio de tentativa e erro como voce mesmo citou.

Mais conseguir resolver, bastou apenas mudar o meu codigo no servidor, pois eu estava retornado null enquanto deveria retornar uma lista, um erro pra lá de “infantil”

O meu código ficou da seguinte forma:

servidor.java
public List mostrar() throws RemoteException { List<Contato> lista = null; try { ContatoDao dao = new ContatoDao(); lista = dao.getLista(); }catch (Exception ex){ System.out.println("Nao foi possivel listar!\n"); ex.printStackTrace(); } return lista; }

ContatoDao

[code]public List getLista() throws SQLException {
//public List getLista(Contato c1) throws SQLException {
//String sql = “SELECT * FROM agenda order by nome”;
String sql = “SELECT * FROM agenda order by nome”;
java.sql.PreparedStatement stmt = this.conexao.prepareStatement(sql);
//stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();

    List<Contato> minhaLista = new ArrayList<Contato>();

    while (rs.next()) {
        Contato c1 = new Contato();
        c1.setId(Long.valueOf(rs.getString("id")));
        c1.setNome(rs.getString("nome"));
        c1.setTelefone(rs.getString("telefone"));
        c1.setEmail(rs.getString("email"));
        c1.setApelido(rs.getString("apelido"));
        minhaLista.add(c1);
    }

    rs.close();
    stmt.close();
    return minhaLista;
}[/code]

Mais tem uma coisa meio xata nesse listar, por exemplo caso eu tenha quatro registro, quando pressiono a primeira vez o botão listar ele me mostra os 4 registros e caso eu aperte novamente o botão listar na mesma tela de execução ele me retorna os quatro registros mais quatro linhas em branco.

Tem algum metodo que eu possa fazer para eliminar essas quatro linhas em branco ?!

[quote=jjrc]Mais tem uma coisa meio xata nesse listar, por exemplo caso eu tenha quatro registro, quando pressiono a primeira vez o botão listar ele me mostra os 4 registros e caso eu aperte novamente o botão listar na mesma tela de execução ele me retorna os quatro registros mais quatro linhas em branco.

Tem algum metodo que eu possa fazer para eliminar essas quatro linhas em branco ?![/quote]

Parece um problema no cliente, e não no servidor. Não tem como a gente adivinhar sem o código.

[quote=Bruno Laturner][quote=jjrc]Mais tem uma coisa meio xata nesse listar, por exemplo caso eu tenha quatro registro, quando pressiono a primeira vez o botão listar ele me mostra os 4 registros e caso eu aperte novamente o botão listar na mesma tela de execução ele me retorna os quatro registros mais quatro linhas em branco.

Tem algum metodo que eu possa fazer para eliminar essas quatro linhas em branco ?![/quote]

Parece um problema no cliente, e não no servidor. Não tem como a gente adivinhar sem o código.[/quote]

Para criar o modelo de minha tabela usei o seguinte codigo

DefaultTableModel tmContato = new DefaultTableModel(null, new String[]{"ID", "Nome", "Telefone", "Email", "Apelido"}); List<Contato> contato; ListSelectionModel lsmContato;

E para fazer a listagem dos meus contatos o seguinte codigo abaixo

[code]private void mostraResultados(List contato) {
desabilitaDados();
jBalterar.setEnabled(true);
jBexcluir.setEnabled(true);
jBsalvar.setEnabled(false);
jBlimpar.setEnabled(false);

	String[] linha = new String[]{null, null, null, null, null};
	for (int i = 0; i < contato.size(); i++) {
		tmContato.addRow(linha);
		tmContato.setValueAt(contato.get(i).getId(), i, 0);
		tmContato.setValueAt(contato.get(i).getNome(), i, 1);
		tmContato.setValueAt(contato.get(i).getTelefone(), i, 2);
		tmContato.setValueAt(contato.get(i).getEmail(), i, 3);
		tmContato.setValueAt(contato.get(i).getApelido(), i, 4);
	}
}[/code]

Sinceramente, seu maior problema está no DefaultTableModel. O certo é não usá-lo e sim criar seu próprio TableModel (que estende de AbstractTableModel).

Aí você faria:

seuTableModel.limpa();
for (Contato c : contato) {
    seuTableModel.adiciona(c);
}

Um exemplo aqui.