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

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:

[code]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

}
[/code]
Espero que tenham entendido e possam me ajudar!
T+

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

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:

Não sofra!!! Use Hibernate

Sofrer tbm tem lá os seus beneficios.

Boa noite a todos.

[quote=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: [/quote]

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.

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

Sofrer tbm tem lá os seus beneficios. [/quote]

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

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

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.

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: fredsilva.sistemas@gmail.com
Agradeço a todos pela ajuda!
T+