NullPointerException - JDBC

8 respostas
E

Gostaria que a galera me explicasse porque está dando NullPointer no meu método abaixo:

public void cadastro(){
		//criarObjeto();
		Scanner dado=new Scanner(System.in);
		Scanner dado2=new Scanner(System.in);
		System.out.println("Digite a função ");
		this.funcao=dado.next().toUpperCase();
		System.out.println();
		System.out.println("Digite o nome: ");
		setNome(dado.next());
		System.out.println();
		System.out.println("Digite o CPF");
		setCpf(dado.next());
		System.out.println("Digite a idade do funcionario");
		setIdade(dado.nextInt());
		System.out.println();
		System.out.println("Digite o endereço do funcionario");
		setEndereco(dado2.nextLine());		
		Funcionario f = new Funcionario();
		f.conetarBanco();
		String query = "INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)";
		PreparedStatement stm;
		try {
			stm = conn.prepareStatement(query);
			stm.setString(1, getNome());
			stm.setString(2, getEndereco());
			stm.setString(3, funcao);
			stm.setString(4, getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		
	}

Erro:

Exception in thread "main" java.lang.NullPointerException at perfaco.pagamento.Funcionario.cadastro(Funcionario.java:57) at perfaco.pagamento.TestaConexao.main(TestaConexao.java:9)

O NullPointer aparece quando eu executo o método na minha classe TestaConeao e aponta p/ o atributo query que eu criei!

public class TestaConexao {


	public static void main(String[] args) {
	 
		Funcionario f = new Funcionario();
		f.cadastro();
		
		
		

	}

}

Valeu a ajuda galera!

8 Respostas

marcosharbs

em qual linha do método cadastro() que estoura o null pointer?
ali diz que é na linha 57 da classe Funcionário
mas como você so colocou o método não da para saber a linha exata.

I

Estou com uma leve impressão de que é nessa linha

stm = conn.prepareStatement(query);

vc instanciou o seu objeto conn antes de chama-lo aqui?

E

Isso mesmo.
Nessa Linha ai!

stm = conn.prepareStatement(query);

I

bem possível então que vc não fez um conn = new Connection…(ou algo assim, não uso preparedStatemente então nem lembro)

posta o código inteiro.

E
package perfaco.pagamento;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;


public class Funcionario extends Pessoa {
	private String funcao;
	private double diaria,salarioFixo,valorHoraExtra,faltas,sabados,salarioFinal,vale;
	private  int contaFuncionario;
	private Connection conn;
	
	//METODO PARA CONECTAR AO BANCO DE DADOS//////
	public void conetarBanco(){
		  String driver = "com.mysql.jdbc.Driver";
          String user = "root";
          String pass = "root";
          String urlPadrao = "jdbc:mysql://localhost:3306/mysql";
         try{
          Class.forName(driver);
		   conn = DriverManager.getConnection(urlPadrao,user,pass);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
          System.out.println("Conexão estabelecida com sucesso");
	}
	
	////////////METODO CADASTRAR/////////////
	public void cadastro(){
		//criarObjeto();
		Scanner dado=new Scanner(System.in);
		Scanner dado2=new Scanner(System.in);
		System.out.println("Digite a função ");
		this.funcao=dado.next().toUpperCase();
		System.out.println();
		System.out.println("Digite o nome: ");
		setNome(dado.next());
		System.out.println();
		System.out.println("Digite o CPF");
		setCpf(dado.next());
		System.out.println("Digite a idade do funcionario");
		setIdade(dado.nextInt());
		System.out.println();
		System.out.println("Digite o endereço do funcionario");
		setEndereco(dado2.nextLine());		
		Funcionario f = new Funcionario();
		f.conetarBanco();
		String query = "INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)";
		PreparedStatement stm;
		try {
			stm = conn.prepareStatement(query);
			stm.setString(1, getNome());
			stm.setString(2, getEndereco());
			stm.setString(3, funcao);
			stm.setString(4, getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		
	}
////////////////METODO ALTERAR CADASTRO///////////////////
	public void alterarCadastro(){
		Scanner dado=new Scanner(System.in);
		while(true){
			System.out.println("O QUE DESEJA ALTERAR? ");
			System.out.println();
			System.out.println("1- Função");
			System.out.println("2- Nome");
			System.out.println("3- CPF");
			System.out.println("4- Endereço");
			System.out.println("9- FIM!");
			int opcao;
			opcao=dado.nextInt();
			if(opcao==9){
				break;
			}else{
			switch(opcao){
			case'1':
				System.out.println("DIGITE A NOVA FUNÇÃO");
				this.funcao=dado.next();
				break;
			case '2':
				System.out.println("Digite  o nome");
				setNome(dado.next());
				break;
			case'3':
				System.out.println("Digite o CPF");
				setCpf(dado.next());
				break;
			case'4':
				System.out.println("Digite o endereço");
				setEndereco(dado.next());
			default:
				System.out.println("Opção inválida, tente novamente");
			}
			}
		}
	}
////////////METODO CALCULAR SALARIO///////////////////////////////	
	public void calculaSalario(){
		Scanner dado=new Scanner(System.in);
		if(funcao.equalsIgnoreCase("ESTAGIÁRIO")){
			this.salarioFixo=600;
			this.diaria=this.salarioFixo/30;
			System.out.println("Quantos sábados o Funcionario trabalhou?");
			this.sabados=dado.nextDouble();
			this.salarioFinal=this.salarioFixo-(this.faltas*this.diaria)+(this.sabados*this.valorHoraExtra)-(this.vale);
			System.out.println(this.salarioFinal);
			
		}else if (funcao.equalsIgnoreCase("MOTORISTA")) {
			this.salarioFixo=1000;
			this.diaria=this.salarioFixo/30;
			System.out.println("Quantos sábados o Funcionario trabalhou?");
			this.sabados=dado.nextDouble();
			this.salarioFinal=this.salarioFixo-(this.faltas*this.diaria)+(this.sabados*this.valorHoraExtra)-(this.vale);
			System.out.println(this.salarioFinal);
			
		}else if(funcao.equalsIgnoreCase("GERENTE")){
			this.salarioFixo=2500;
			this.diaria=this.salarioFixo/30;
			System.out.println("Quantos sábados o Funcionario trabalhou?");
			this.sabados=dado.nextDouble();
			this.salarioFinal=this.salarioFixo-(this.faltas*this.diaria)+(this.sabados*this.valorHoraExtra)-(this.vale);
			System.out.println(this.salarioFinal);
		}
			
		}
	
///////////////IMPRIME INFORMAÇÕES DO FUNCIONARIO//////////
	public void imprimeInformacao(){
		System.out.println("Nome: "+getNome());
		System.out.println("CPF: "+getCpf());
		System.out.println("Endereço: "+getEndereco());
		System.out.println("Idade: "+getIdade());
	}
	
	
	
	
	public double getFaltas() {
		return faltas;
	}
	public void setFaltas(double faltas) {
		this.faltas = faltas;
	}
	public double getVale() {
		return vale;
	}
	public void setVale(double vale) {
		this.vale = vale;
	}
	public  Funcionario(String funcao){
		this.funcao=funcao;
	}	
	public Funcionario(){
		
	}
		

}

Não consegui instanciar o conn.
Valeu a ajuda cara!

marcosharbs

o nullpointer ocorre nesta linha

stm = conn.prepareStatement(query);

provavelmente sua variável conn está nula
você está abrindo uma conexão com o banco?

I

Cara, isso tudo é uma classe só? se for, eu acho que saquei o problema, ta aqui ó

nessa linha tu instancia o conn conn = DriverManager.getConnection(urlPadrao,user,pass);
essa linha ai está dentro do método conectarBanco() então bastaria que vc chamasse o método para que o conn fosse instanciado, porém o que vc faz, cria um novo objeto Funcionário e chama o método através dele, com isso o conn instanciado é outro e não o que vc quer mecher, quando na linha do erro vc chama o conn, ele da null pointer, pq naquele objeto que vc está manipulando ele não foi instanciado.

Tenta fazerconectarBanco(); ao invés de Funcionario f = new Funcionario(); f.conetarBanco();

lucasportela

Por que instanciou Funcionario para chamar a conexao se você pode chamar o método de conexão sem instanciar?

Criado 12 de agosto de 2011
Ultima resposta 12 de ago. de 2011
Respostas 8
Participantes 4