NullPointerException com BD

9 respostas
Arkimedes

E ae galera blz!!!??? Sou novo também na linguagem Java e estou com uma dúvida cruel. Minha aplicação é um pequeno dicionário de inglês-português. O que estou tentanto fazer é capturar a palavra que o usuário digita na JTextField e usá-la como argumento de entrada para acessar ao banco de dados, esse vai retornar o texto na JTextPane ao se clicar no botão para pesquisar. Já tentei de várias formas, mas não obtive êxito.

Essa é a classe Painel.
Object fonte = evt.getSource();
		if (fonte == getBotaoPesquisar()){
			
			try {
				acesso = new String("love");
				acesso = getTextPalavra().getText();
				banco = new BancoDados();
				getArea().setText(banco.nome.toUpperCase()+"\n"+banco.texto);
				getTextPalavra().selectAll();
				
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, e.toString() + " " + e.getMessage(), "Erro", 
						JOptionPane.ERROR_MESSAGE);
			}
			
		}
Esta é a classe BancoDados
public BancoDados(){
		super();
		String banco = "jdbc:odbc:Dicionario";
	    entrada = painel.acesso;
// 	    entrada = JOptionPane.showInputDialog(null, "Informe a palavra","Dicionário Selene",
//				JOptionPane.PLAIN_MESSAGE);

		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			Connection conn = DriverManager.getConnection(banco, "", "");
			Statement st = conn.createStatement();
			ResultSet rec = st.executeQuery(
					"SELECT * " +
					"FROM TEXTO " +
					"WHERE " +
					"(PALAVRA ='" + entrada + "')");
			while(rec.next()){
				nome = rec.getString(2);
				texto = rec.getString(3);
//				JOptionPane.showMessageDialog(null, rec.getString(2) + "\n" + "\t\t" 
//						+ rec.getString(3),"Dicionário Selene",JOptionPane.PLAIN_MESSAGE);
			}
			
			st.close();

9 Respostas

gilmaslima

Esse erro dá quando vc tenta usar uma variável que não foi inicializada!

De uma revisada no seu código, ou passe ele completo.

Arkimedes

Bom cara! Como posso inicializar uma String? Já tentei pelo comando new String();, ma não deu certo! Já testei
se ele tá peganto o texto digitado e está pegando normalmente, mesmo declarando a String como null. O problema é quando quero passar o texto para entrada do Banco de Dados!

Arkimedes
Estou mandando o códgio completo entao!
package view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import model.BancoDados;

public class Painel extends JPanel implements ActionListener{
	
	private static final long serialVersionUID = 1L;
	
	private JButton pesquisar = null;
	private JTextField jtPalavra = null;
	private JLabel palavra = null;
	private JTextPane area = null;
	private JScrollPane barra = null;
	private JComboBox combo = null;
	private BancoDados banco = null;
	public String acesso = null; //AQUI A VARIAVEL QUE DEVE CONTER O ARGUMENTO AO BD
	
	public Painel(){
		super(new BorderLayout());
		setLayout(null);
		add(getCombo());
		add(getLabelPalavra());
		add(getTextPalavra());
		add(getBotaoPesquisar());
		add(getBarra());
		setBackground(Color.DARK_GRAY);
		add(getImg());
	}
	
	public JComboBox getCombo(){ //lista
		if (combo == null){
			combo = new JComboBox();
			combo.addItem("LOVE");
			combo.addItem("NEED");
			combo.addItem("WISH");
			combo.setBounds(5, 180, 110, 30);
			Box box = Box.createVerticalBox();
			box.setBorder(BorderFactory.createTitledBorder(" PALAVRA: "));
			box.add(combo);
			combo.addActionListener(this);
		}
		return combo;
	}
	
	public JTextPane getArea(){ //area do texto de saida
		if (area == null){
			area = new JTextPane();
			area.setFont(new Font("Times", Font.BOLD, 14)); //fonte do texto 
			area.setBounds(120, 130, 500, 300);
			area.setEditable(false); //impedir a edicao
		}
		return area;
	}
	
	public JScrollPane getBarra(){ //barra de rolagem
		if (barra == null){
			barra = new JScrollPane(getArea());
			barra.setBounds(120, 130, 500, 300);
	        barra.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //default
	        barra.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); //default
		}
		return barra;
	}
	
	public JLabel getImg() {  //IMAGEM do painel
		JLabel img = new JLabel();
		img.setIcon(new javax.swing.ImageIcon("c:/logotipo.jpg"));
		img.setBounds(3, 3, 252, 83);
		return img;
	}
	
	public JButton getBotaoPesquisar(){ // botao pesquisar
		if(pesquisar == null){
			pesquisar = new JButton("Pesquisar");
			pesquisar.setBounds(3, 130, 100, 22);
			pesquisar.addActionListener(this);
		}
		return pesquisar;
	}
	
	public JLabel getLabelPalavra(){ //inserir rotulo palavra
		if(palavra == null){
			palavra = new JLabel("Palavra:");
			palavra.setBounds(4, 100, 100, 22);
			palavra.setFont(new Font("Courier new", Font.BOLD, 20));
			palavra.setForeground(Color.ORANGE); //cor da fonte
		}
		return palavra;
	}
	
	public JTextField getTextPalavra(){ // caixa de texto de palavra
		if(jtPalavra == null){
			jtPalavra = new JTextField(40);
			jtPalavra.setBounds(120, 100, 200, 22);
			jtPalavra.addActionListener(this);
		}
		return jtPalavra;
	}
	
	public void actionPerformed(ActionEvent evt){
		Object fonte = evt.getSource();
		if (fonte == getBotaoPesquisar()){
			
			try {
				acesso = getTextPalavra().getText(); //PEGANDO O TEXTO DIGITADO
				banco = new BancoDados(); //CHAMANDO O CONSTRUTOR DO BD
				getArea().setText(banco.nome.toUpperCase()+"\n"+banco.texto);
				getTextPalavra().selectAll();
				
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, e.toString() + " " + e.getMessage(), "Erro", 
						JOptionPane.ERROR_MESSAGE);
			}
			
		}
		
		JComboBox cb = (JComboBox)evt.getSource();
		String name = (String)cb.getSelectedItem();
		atualizaLabel(name);
	
	}
	
	public void atualizaLabel(String name){
		if(name == "LOVE"){
			File file = new File("c:/dic/love.txt");
			
			try {
				FileReader fr= new FileReader(file);
				BufferedReader br = new BufferedReader(fr);
				String s = "";
				String d = "";
				while ((s = br.readLine()) != null){
					d += s + "\n";
				}
				
				getArea().setText(d);
				
			} catch (FileNotFoundException fnfe) {
				JOptionPane.showMessageDialog(null, "Arquivo não encontrado.");
				fnfe.printStackTrace();
			} catch (IOException ioe){
				
				ioe.printStackTrace();
			}
		}
		if(name == "NEED"){
			File file = new File("c:/dic/need.txt");
			
			try{
				
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String s = "";
			String d = "";
			while ((s = br.readLine()) != null){
				d += s + "\n";
			}
			
			getArea().setText(d);
			
			}catch (FileNotFoundException fnfe) {
				fnfe.printStackTrace();
			}catch (IOException ioe) {
				ioe.printStackTrace();
			}
			
		}
		if(name == "WISH"){
			File file = new File("c:/dic/wish.txt");
			
			try{
				
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String s = "";
			String d = "";
			while ((s = br.readLine()) != null){
				d += s + "\n";
			}
			
			getArea().setText(d);
			
			}catch (FileNotFoundException fnfe) {
				fnfe.printStackTrace();
			}catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}
	
	public Object getDado(Object dados) throws Exception{
		Dominio dominio = (Dominio) dados;
		dominio.setPalavra(getTextPalavra().getText());
		
		return dominio;
	}

}

A seguinte é a classe que faz o acesso ao Bando de Dados!

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;

import view.Painel;

public class BancoDados {
	
	public String nome = null;
	public String texto = null;
	private Painel painel = new Painel();
	private String entrada = new String();
	
	public BancoDados(){
		super();
		String banco = "jdbc:odbc:Dicionario";
	    entrada = painel.acesso; //CHAMANDO A VARIAVEL DIGITADA DA CLASSE PAINEL
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			Connection conn = DriverManager.getConnection(banco, "", "");
			Statement st = conn.createStatement();
			ResultSet rec = st.executeQuery(
					"SELECT * " +
					"FROM TEXTO " +
					"WHERE " +
					"(PALAVRA ='" + entrada + "')");
			while(rec.next()){
				nome = rec.getString(2);
				texto = rec.getString(3);
			}
			
			st.close();
			
		}catch (SQLException sqle) {
			JOptionPane.showMessageDialog(null, "SQL Error: " + sqle.toString() + " " + 
					sqle.getErrorCode() + " " + sqle.getSQLState(),"Erro",
					JOptionPane.ERROR_MESSAGE);
		}catch (Exception e) {
			JOptionPane.showMessageDialog(null,e.toString() + " " + e.getMessage(),"Erro",
					JOptionPane.ERROR_MESSAGE);
		}
	}
	
}
gilmaslima

Declare assim:

private String acesso = “”;

variaveis String (de instancia ou locais) recebem por padãro null quando não são inicializadas.

Arkimedes

Não dá certo não amigão! Já fiz isso. Acho que terei que criar uma classe para tratar disso em especial!
Mas agradeço pelas dicas!

Abraços ae!
Quando conseguir, postarei avisando!
vlws

thundercas

pow cara, se vc disser onde ocorre o erro facilita…

Arkimedes

Bom cara é o sequinte:
Tenho uma classe chamada Painel que contém o método que captura o texto digitado pelo usuário.
Tenho um outra classe chamada BancoDados.
Na classe BancoDados é necessário um argumento de entrada para acessar e pegar os dados do mesmo “setar” na área de texto.
Esse argumento deve ser a palavra digitada pelo usuário e que é capturada pela classe Painel com o método pertinente.
Mas eu já fiz de 10 formas difentes, ou seja, várias instâncias diferentes para jogar a palavra no banco, mas não deu certo mesmo.

por exemplo. Se eu usar um JOptionPane na classe BancoDados, quando a pessoa clicar no batao para pesquisar vai aparecer a janela para a pessoa digitar a palavra ai conforme a palavra estiver no Banco esse vai retornar o consulta. Dessa maneira dá certo. Já fiz o teste. Porém não é o que quero. Quero que a pessoa informe a palavra na própria janela (Frame).

Esta dica foi de um cara em outro forum:

Cara, só olhei este último trecho de código e notei que você acessa o panel de dentro da classe de Banco de Dados… tente não fazer isto, separar a aplicação em MVC é uma ótima prática e ajuda na manutenção e entendimento do problema posteriormente… neste caso, tente passar a palavra obtida no TextField como parametro para o método que faz a busca no banco… Desta forma descrita, você cria uma instância de “Banco de Dados” dentro do Panel e acessa o Panel de dentro do Banco de Dados, pode estar havendo uma confusão de referências…
O melhor é:

  1. Panel pega os dados

  2. Instancia a classe de acesso ao banco

  3. chama um método passando os parâmetros de consulta

Obs.: como é consulta não cito uma classe de Regra de Negócio ou controlador também, mas não seria mal negócio…

Abraços…

Espero ter esclarecido melhor!
Valeu pela atenção!
Abraços!

Arkimedes

Aqui outra dica:

[size=18]
O que está acontecendo é que voce está pedendo a instancia de seu painel. Faça o seguinte, crie um java bean, jogue seus dados do painel dentro dele. Aproveitando a mesma instancia do bean, chame a classe banco de dados, passando para seu construtor a instancia do bean. Ai voce nao perderá os valores capturados na tela. [/size]

Arkimedes

Bom… consegui fazer o Banco de Dados ter acesso à palavra digitada pelo usuário passando um parâmetro ao construtor da classe BancoDados.
Bom ficou assim, porém dá um erro de java.lang.ClassCastException: javax.swing.JButton, mas a aplicação está rodando normalmente.

public class ControlePainel implements ActionListener{
	
	private Painel painel = null;
	private Dominio dominio = null;
	private BancoDados banco = null;

	public ControlePainel(Painel jPainel) {
		super();
		this.painel = jPainel;
	}
	
	public void actionPerformed(ActionEvent evt){
		Object source = evt.getSource();
		if (source == painel.getBotaoPesquisar()){
			
			try {
				dominio = new Dominio();
				dominio = (Dominio) painel.getDado(dominio);
				banco = new BancoDados(enviar());
				painel.setDado(dominio);
				painel.getArea().setText(banco.nome.toUpperCase()+ "\n"+ banco.texto);
			
			} catch (MinhaExcecao me) {
				JOptionPane.showMessageDialog(null, me.getResposta(),"Erro",
						JOptionPane.ERROR_MESSAGE);
			}
	
		}
		JComboBox cb = (JComboBox)evt.getSource();
		String name = (String)cb.getSelectedItem();
		atualizaLabel(name);
		
	}
	
	public String enviar(){
		String acesso = dominio.getPalavra();
		
		return acesso;
	}

BancoDados

public class BancoDados {
	
	public String nome = null;
	public String texto = null;

	public BancoDados(String entrada){
		super();
		String banco = "jdbc:odbc:Dicionario";
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			Connection conn = DriverManager.getConnection(banco, "", "");
			Statement st = conn.createStatement();
			ResultSet rec = st.executeQuery(
					"SELECT * " +
					"FROM TEXTO " +
					"WHERE " +
					"(PALAVRA ='" + entrada + "')");
			while(rec.next()){
				nome = rec.getString(2);
				texto = rec.getString(3);
			}
			
			st.close();
			
		}catch (SQLException sqle) {
			JOptionPane.showMessageDialog(null, "SQL Error: " + sqle.toString() + " " + 
					sqle.getErrorCode() + " " + sqle.getSQLState(),"Erro",
					JOptionPane.ERROR_MESSAGE);
		}catch (Exception e) {
			JOptionPane.showMessageDialog(null,e.toString() + " " + e.getMessage(),"Erro",
					JOptionPane.ERROR_MESSAGE);
		}
	}	
}

flws

Criado 5 de outubro de 2008
Ultima resposta 7 de out. de 2008
Respostas 9
Participantes 3