Erro que enche o saco. Mas vc pode achar trivial!

Pessoal… estou com um erro que está me enchendo o saco e não consigo achar a solução.
É o seguinte… tenho 4 class
1 - Class CadastroClienteGraf que é a parte visual do programa, que possui os campos a serem preenchidos (JTextField).
2 - Class ClientesDAO que possui os metodos gravar no banco de dados.
3 - Class ClienteJavaBean que tem as variaveis com os metodos get e set.
4 - Class conexao que faz a conexao com o banco de dados.

Quando aperto o botão salvar aparece o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at ClientesDAO.gravar_DAO_Cli(ClientesDAO.java:78) at CadastroClienteGraf$2.actionPerformed(CadastroClienteGraf.java:727) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

[color=red]Da uma olhada no codigo que os comentarios explica mais ou menos onde está os erros.
E agradeço se puderem ajudar… vlw[/color]

Meu codigo:

[code]public class CadastroClienteGraf extends JFrame {

private JTextField JTextFieldNome = null;

conexao conecta_cli = new conexao();

public CadastroClienteGraf() {
	super();
	conecta_cli.conecta();
	initialize();
	preencher_JTable();
}

private void initialize() {
	this.setContentPane(getJContentPane());
	this.setTitle("EnigMais - Cadastro Cliente");
	this.setIconImage(Toolkit.getDefaultToolkit().getImage("D:/Imagens/Simbolo sem fundo2.png"));
	this.setBounds(new Rectangle(0, 0, 1192, 567));
}

private JPanel getJContentPane() {
	if (jContentPane == null) {
		jContentPane.add(getJTextFieldNome(), null);
	}
}

public JTextField getJTextFieldNome() {
	if (JTextFieldNome == null) {
		JTextFieldNome = new JTextField();
		JTextFieldNome.setBounds(new Rectangle(213, 71, 207, 18));
		JTextFieldNome.setEnabled(true);
		JTextFieldNome.setText("");
		JTextFieldNome.setFont(new Font("Dialog", Font.PLAIN, 11));
	}
	return JTextFieldNome;
}

private JButton getBotaoSalvarCliente() {
	if (BotaoSalvarCliente == null) {
		BotaoSalvarCliente = new JButton();
		BotaoSalvarCliente.setBounds(new Rectangle(292, 430, 141, 24));
		BotaoSalvarCliente.setEnabled(true);
		BotaoSalvarCliente.setText("Salvar/Fechar");
		BotaoSalvarCliente.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent evt) {
							
							ClientesDAO CliDAO = new ClientesDAO();
							CliDAO.teste(); // ESSE METODO IMPRIME VAZIO.. NÃO ESTÁ PEGANDO OS DADOS DO JTEXTFIELD PREENCHIDO PELO USUARIO.

// PERCEBAM QUE LOGO A BAIXO TEM UM METODO NESSA MESMA CLASS QUE SE CHAMA gravar_cliente_bd() E FUNCIONA PERFEITAMENTE
//NO ENTANTO ESSE METODO CliDAO.gravar_DAO_Cli(); QUE ESTÁ NA CLASS DAO N FUNCIONA.

							CliDAO.gravar_DAO_Cli();
							System.exit(0); 
						}	}
				});	}
	return BotaoSalvarCliente;
}

public void gravar_cliente_bd(){
	try {
		String sqlinsert = "insert into cliente (nomeCliente) values (' "+JTextFieldNome.getText()+" ' )";
		
		conecta_cli.statement.executeUpdate(sqlinsert);

	} catch (SQLException e) {
		e.printStackTrace();
	}
}

}[/code]

[code]public class ClientesDAO { //CLASS QUE SUPONHO SER PROBLEMATICA.
ClienteJavaBean Cli_JB = new ClienteJavaBean();
conexao conecta_cli = new conexao();

public ClientesDAO(){
	conecta_cli.conecta();
}

public void gravar_DAO_Cli(){
try {
	String sqlinsert = "insert into cliente (nomeCliente) values ( ' "+Cli_JB.getJB_JTextFieldNome()+ " ')";
conecta_cli.statement.executeUpdate(sqlinsert);
	
} catch (SQLException e) {
	JOptionPane.showMessageDialog(null, "Não está conseguindo salvar. Erro: "+e);
	e.printStackTrace();
}
}

public void teste(){  //METODO SÓ PRA VERIFICAR O QUE ESTÁ SENDO CAPTURADO DO JTEXTFIELD PREENCHIDO PELO USUARIO
JOptionPane.showMessageDialog(null, Cli_JB.getJB_JTextFieldNome() );
}

}[/code]

[code]public class ClienteJavaBean implements java.io.Serializable {

private String JB_JTextFieldNome;
CadastroClienteGraf cadCliGrf = new CadastroClienteGraf();

public ClienteJavaBean() {
}

public String getJB_JTextFieldNome() {
	String GF_JTextFieldNome = cadCliGrf.getJTextFieldNome().getText();
	this.JB_JTextFieldNome = GF_JTextFieldNome;
	return JB_JTextFieldNome;
}

public void setJB_JTextFieldNome(String jB_JTextFieldNome) {
	JB_JTextFieldNome = jB_JTextFieldNome;
}

}[/code]

[code]public class conexao {

private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/EnigMaisBancoDDados";
private static final String usuario = "root";
private static final String senha = "minhasenha";
private Connection conexao;
public Statement statement;
public ResultSet resultset;

public boolean conecta() {
	boolean result = true;
	try {
		Class.forName(driver);
		conexao = DriverManager.getConnection(url, usuario, senha);
		JOptionPane.showMessageDialog(null, "conectou");
	} catch (ClassNotFoundException Driver) {
		JOptionPane.showMessageDialog(null, "Driver não localizado: "+ Driver);
		result = false;
	} catch (SQLException Fonte) {
		JOptionPane.showMessageDialog(null,
				"Deu erro na conexão com a fonte de dados: " + Fonte);
		result = false;
	}
	return result;
}

public void desconecta() {
	boolean result = true;
	try {
		conexao.close();
		JOptionPane.showMessageDialog(null, "banco fechado");
	} catch (SQLException fecha) {
		JOptionPane.showMessageDialog(null,
				"Não foi possivel fechar o banco de dados : " + fecha);
		result = false;
	}
}

public void executeSQL(String sql) {
	try {
		
		statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
						ResultSet.CONCUR_READ_ONLY);
		resultset = statement.executeQuery(sql);
	} catch (SQLException sqlex) {
		JOptionPane.showMessageDialog(null,
				"Não foi possivel executar o comando sql" + sqlex + "O sql passado foi" + sql);
	}
}

}[/code]

Obs. apesar de ter ficado grande o comentario… o codigo já foi enchugado pra ficar o menor possivel se mantendo claro.
E não tem erro de compilação… é só erro de execução.

O que existe na linha indicada com o NPE at ClientesDAO.gravar_DAO_Cli(ClientesDAO.java:78) ???

[code]at ClientesDAO.gravar_DAO_Cli(ClientesDAO.java:78) -> conecta_cli.statement.executeUpdate(sqlinsert); //dentro do metodo gravar_DAO_Cli() da class ClientesDAO

at CadastroClienteGraf$2.actionPerformed(CadastroClienteGraf.java:727) -> CliDAO.gravar_DAO_Cli(); // dentro da class CadastroClienteGraf invocado no botão salvar
[/code]

Então, camarada, NPE indica que alguma coisa ali está nula…
Ou o conecta_cli ou o statement ou o sqlinsert…
Aliás, por que está invocando uma variável e não um método get???

amigo… seguinte…

você fez uma bagunça aí com seu código que foi difícil até de achar o erro…
tente depois dar uma olhada melhor em orientação a objeto…

mas vamos la… vou tentar explicar

primeiro… é óbvio que o seu teste() vai imprimir em branco… por que?

porque você criou uma instância novíssima da classe ClientesDAO aí e ja mandou executar…
até aí você imagina que está tudo bem, porque o seu bean é inteligente o suficiente pra ir buscar o valor diretamente do campo de texto, certo? não…

se você olhar direito no seu bean, você cria um novo objeto da classe CadastroClienteGraf (note que não é o mesmo que estava em execução anteriormente, então não é o mesmo que tem o campo de texto preenchido).

esse objeto tem sim um inputtext como o outro, mas é novo, então está vazio…

CadastroClienteGraf(com o campo preenchido) > ClientesDAO > CadastroClienteGraf(novo… sem nada preenchido)

a coisa está mais ou menos assim… ficou uma bagunça de instâncias aí… tente dar uma revisada em jeitos melhores de preencher o seu bean com a informação do input

abraço!

Seguindo o raciocínio do digaoneves:
A classe DAO sempre receberá parâmetros, nunca deve ser instanciada da forma como você fez.
Se precisa de um método dela, crie um objeto e invoque o método, passando os parâmetros através de um DTO (Data Transfer Object), tanto para enviar, quanto para receber o que foi processado e retornado pela DAO.

//logica aqui
ClasseDAO cDao = new ClasseDAO();
cDao.chamaMetodoUm();
cDao.chamaMetodo2(passaParametroUmDTORequest);
RecebeParametroDTOResponse parRes = cDao.chamaMetodo3();
//termina a logica aqui

Compreende?

Se eu deixar os metodos getJTextFieldNome() na class CadastroClienteGraf statico…
e colocar na class javabean dessa forma:

public String getJB_JTextFieldNome() { String GF_JTextFieldNome = CadastroClienteGraf.getJTextFieldNome().getText(); // sem criar instancia this.JB_JTextFieldNome = GF_JTextFieldNome; return JB_JTextFieldNome; }

Vai funcionar… no entanto me recomendaram a evitar o static.

Eu não compreendi a orientação do drsmachado… to por fora de DTO ainda…
Tem alguma solução de como deveria ficar o codigo?

Pois é, é preciso estudar…
E, da onde veio a idéia de colocar static?
Não há razão para isto…

Certo… estudar é a única coisa que eu venho fazendo =]
Vamos lá… pra resolvar essa situação… quais os topicos ou links que vc acha que eu devo estudar?

DAO, DTO e Beans…

com isso você faz facil o que ta querendo aí

Boa tarde, Abner David da Silva Tole!

Meu amigo, seu código está dando um monte de voltas que não dá para entender, sem necessidade.

Você está fazendo um caminho gigantesco que poderia ser feito em poucas linhas. Se eu fosse você pegaria para refazer seu código desde o início. Tem algumas partes que você acaba se perdendo no raciocínio e por isso não está chegando ao resultado correto.

O seu botão está tentando pegar o texto de um JTextField que sequer existia, ele cria o JTextField e imediatamente tenta pegar o texto, ou seja, não tem texto.

Essa é uma das coisas observadas no que diz respeito ao erro.

Você precisa organizar melhor as coisas e aplicar de forma correta a OO no seu projeto.

Abraço e boa sorte!

EDIT: digaoneves, não tenho inteção nenhuma de aumentar meu número de postagens, apenas dei a minha opinião. Você se dói por muito pouco. Olha o coração, brother! E quanto a ganhar número de postagens, você ja ganhou mais que eu com seus comentários que tiram o foco do tópico.

[color=red]Obs.: Edição feita com relação a postagens que vêm a seguir.[/color]

Parabéns pro amigo aí que postou coisas que ja foram ditas pra ganhar um post a mais :wink:

Para qual dos dois? Ou um ou outro ou ambos?

Para qual dos dois? Ou um ou outro ou ambos?[/quote]

Não vão perder o foco do TÓPICO! :evil:

to falando do amigo Vingdel que tem um post bem parecido com o meu, que ainda foi melhor explicado com o seu

Pessoal… com esse codigo do jeito que está agora…
ql seria a alteração que vcs fariam pra funcionar?
invocando o metodo pela class DAO.