Dúvida Orientação a Objetos [RESOLVIDO]

10 respostas
fredsilva.sistemas

Olá pessoal,
tenho um método consultarVeiculo que está ocorrendo um erro de NullPointerException, sei que é só um erro de semântica, pois tenho na minha classe Veiculo um atributo do tipo StatusVeiculo, mas quando vou setar o valor do resultSet nele dá esse erro:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ControllerVeiculos.VeiculoController.consultarVeiculo(VeiculoController.java:135)
at ViewVeiculos.FormVisualizarVeiculo.formWindowActivated(FormVisualizarVeiculo.java:491)
at ViewVeiculos.FormVisualizarVeiculo.access$000(FormVisualizarVeiculo.java:30)
at ViewVeiculos.FormVisualizarVeiculo$1.windowActivated(FormVisualizarVeiculo.java:95)
at java.awt.AWTEventMulticaster.windowActivated(AWTEventMulticaster.java:372)
at java.awt.Window.processWindowEvent(Window.java:1874)
at javax.swing.JFrame.processWindowEvent(JFrame.java:279)
at java.awt.Window.processEvent(Window.java:1820)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:889)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:409)
at java.awt.Component.dispatchEventImpl(Component.java:4455)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.SentEvent.dispatch(SentEvent.java:55)
at java.awt.DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent.dispatch(DefaultKeyboardFocusManager.java:183)
at java.awt.DefaultKeyboardFocusManager.sendMessage(DefaultKeyboardFocusManager.java:210)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:286)
at java.awt.Component.dispatchEventImpl(Component.java:4455)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.SequencedEvent.dispatch(SequencedEvent.java:101)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
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)

Veja o método:
public List consultarVeiculo(Integer id) throws SQLException{
        List listaVeiculos = new ArrayList();
        banco.abrirConexao((String) objDados.driver, (String) objDados.url, (String) objDados.usuario, objDados.senha);
        try{
            Statement statement = banco.conexao.createStatement();
            ResultSet resultSet = null;
            resultSet = statement.executeQuery("SELECT * FROM \"VEICULO\" WHERE \"VEI_IDDOOBJETO\" = "+id+";");
            while (resultSet.next()){
                Veiculo veiculo = new Veiculo();                
                veiculo.setId(resultSet.getInt("VEI_IDDOOBJETO"));
                veiculo.setPlaca(resultSet.getString("VEI_PLACA"));
                veiculo.setMarca(resultSet.getString("VEI_MARCA"));
                veiculo.setModelo(resultSet.getString("VEI_MODELO"));
                veiculo.setPatrimonio(resultSet.getString("VEI_PATRIMONIO"));
                veiculo.setTipoServico(resultSet.getString("VEI_TIPOSERVICO"));
                veiculo.setCor(resultSet.getString("VEI_COR"));                
                veiculo.setTipoCombustivel(resultSet.getString("VEI_TIPOCOMBUSTIVEL"));
                veiculo.setRendimento(resultSet.getDouble("VEI_RENDIMENTO"));
                veiculo.setAnoFab(resultSet.getString("VEI_ANOFAB"));
                veiculo.setAnoMod(resultSet.getString("VEI_ANOMOD"));
                veiculo.setRenavan(resultSet.getLong("VEI_RENAVAN"));
                veiculo.statusVeiculo.setId(resultSet.getInt("VEI_IDSTATUSVEICULO"));//Dá erro nesta linha
                listaVeiculos.add(veiculo);
            }
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
        }
        return listaVeiculos;
    }
Minha classe Veiculo:
public class Veiculo {
    //Aqui tenho vários atributos
    public StatusVeiculo statusVeiculo;

    public StatusVeiculo getStatusVeiculo() {
        return statusVeiculo;
    }

    public void setStatusVeiculo(StatusVeiculo statusVeiculo) {
        this.statusVeiculo = statusVeiculo;
    }
    //Aqui tenho meus demais get e set
}
Espero que tenham entendido e possam me ajudar! T+

10 Respostas

E

No programa que você postou, qual é a linha 135?

Giovanni_Ritchie

Opa… blz??

O erro ocorre porque depois de vc criar o veiculo em momento algum o statusVeiculo passa a referenciar algum objeto, então ele é null, o que vc precisa fzr é adicionar um construtor na classe veiculo e la fzr

this.statusVeiculo = new StatusVeiculo();

ou tbm, no momento da criação do atributo status veiculo fzr o seguinte:

private StatusVeiculo statusVeiculo = new StatusVeiculo().

Abraço :wink:

viniciusfaleiro

Não sofra!!! Use Hibernate

Giovanni_Ritchie

Sofrer tbm tem lá os seus beneficios.

discorpio

Boa noite a todos.

Giovanni Ritchie:
Opa… blz??

O erro ocorre porque depois de vc criar o veiculo em momento algum o statusVeiculo passa a referenciar algum objeto, então ele é null, o que vc precisa fzr é adicionar um construtor na classe veiculo e la fzr

this.statusVeiculo = new StatusVeiculo();

ou tbm, no momento da criação do atributo status veiculo fzr o seguinte:

private StatusVeiculo statusVeiculo = new StatusVeiculo().

Abraço :wink:

Voce também tem esta opção:

public class Veiculo {  
     //Mude o modificador public para private
     private StatusVeiculo statusVeiculo;  
   
     public StatusVeiculo getStatusVeiculo() {
         if (statusVeiculo==null) statusVeiculo = new StatusVeiculo();  // acrescente esta linha
         return statusVeiculo;  
     }  
   
     public void setStatusVeiculo(StatusVeiculo statusVeiculo) {  
         this.statusVeiculo = statusVeiculo;  
     }  
     //Aqui tenho meus demais get e set  
 }

Lá na linha onde dá o erro substitua o atributo statusVeiculo pelo getStatusVeiculo(), assim:

while (resultSet.next()){  
         Veiculo veiculo = new Veiculo();
          .....
          .....                  
          veiculo.getStatusVeiculo().setId(resultSet.getInt("VEI_IDSTATUSVEICULO")); 
          listaVeiculos.add(veiculo);  
}

Algumas regras de encapsulamento:

Voce geralmente utiliza Setters e Getters quando voce quer encapsular atributos do objeto, assim sendo todas as variáveis (atributos) devem primordialmente serem declarados com o modificador “private” e só dar acesso a eles através dos Getters e Setters que devem ser declarados como públicos, senão os Getters e Setters deixam de ter sentido.

Repare que dentro Getter “getStatusVeiculo” e testo se o Objeto StatusVeiculo é nulo, se for ele instancia na hora, se não, ele utiliza o que já está instanciado e passa a fazer referência ao mesmo objeto, e assim voce evita o NullPointer.

A

edit: me enganei em relação as referencias.

viniciusfaleiro

Sofrer tbm tem lá os seus beneficios.

Nussa… achei alguém ainda relusente a um framework de persistência… É isso mesmo?

fredsilva.sistemas

Olá galera!
Obrigado a todos pelas dicas, estou impossibilitado de testar agora, amanhã, segunda-feira, posto o resultado dos testes.
Valeu!

peczenyj

tenho 2 sugestões

  1. Toda a vez que alguem concatena strings para gerar sql um bebe panda morre. use PreparedStatement
  2. Crie uma classe VeiculoDAO e um metodo listarVeiculos que retorna um List - este VeiculoDAO pode lançar uma exception se algum erro for detectado e ai vc mostra num JOptionPane. Imagine que VeiculoDAO é quem sabe que COMO vc usa um banco de dados.
fredsilva.sistemas

Ae galera deu certo!
Fiz como o Giovanni Ritchie falou:
Dentro do método construtor da classe Veiculo

this.statusVeiculo = new StatusVeiculo();

viniciusfaleiro, estou começando a estudar Hibernate, inclusive se vc tiver algum material interessante que possa me passar eu agradeço.
E-mail: [email removido]
Agradeço a todos pela ajuda!
T+

Criado 26 de fevereiro de 2010
Ultima resposta 1 de mar. de 2010
Respostas 10
Participantes 7