Banco de Dados NullPointerException = De novo!

7 respostas
E

Galera, fiz esse mesmo tópico hà umas duas semanas, só que fiquei sem internet nesse período e não pude acompanhar meu tópico.
Em fim, o problema é o seguinte:

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("INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)");
			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(){
		
	}
		

}

O erro é um NullPointer Exception:

Conexão estabelecida com sucesso
Exception in thread "main" java.lang.NullPointerException
	at perfaco.pagamento.Funcionario.cadastro(Funcionario.java:57)
	at perfaco.pagamento.TestaConexao.main(TestaConexao.java:9)
O null pointer apota p/ a linha
stm = conn.prepareStatement("INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)");
e p/ a linha
f.cadastro()
Da classe que eu fiz p/ testar o programa:
public class TestaConexao {


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

	}

}

Se puderem, me ajudem a identificar o porque do nullPointer, ja pesquisei na net e em alguns livros que tenho aqui, porém não consegui encontrar a solução para o problema.
Valeu a ajuda

7 Respostas

E

Obs, eu pulei uma parte do inicio do código, portanto a linha 57 que o erro aponta, na verdade seria a 55.

dsystem

Eliezer,

Posta o seu stackTrace completo!

nel

Oi!

Vou te dizer o que eu acho que está ocorrendo, segundo a linha que você aponta o erro.
Você está conectando a base de dados, está lançando exceção e você está enviando ela para “baixo do tapete”.

Depois você tenta usar a referência que é nula e “vualá”, erro.

stm = conn.prepareStatement("INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)");

Aposto que o Objeto conn está nulo :smiley:

faeldix

public class Funcionario extends Pessoa { private String funcao; private double diaria,salarioFixo,valorHoraExtra,faltas,sabados,salarioFinal,vale; private int contaFuncionario; private Connection conn new Connection(); //muda essa linha

Master.Abs

Eu faria o seguinte, nesse método conectarBanco eu retornaria um Connection
public Connection conetarBanco(){ return conn;}

e ao invés de chamar stm = conn.prepareStatement(“INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)”);
chame o conectarBanco.preparedStatement…

Pois creio que quando voce chama conn está chamando apenas a referencia e a referencia está nula.

Bom creio que seja isso.

nel

faeldix:
public class Funcionario extends Pessoa { private String funcao; private double diaria,salarioFixo,valorHoraExtra,faltas,sabados,salarioFinal,vale; private int contaFuncionario; private Connection conn new Connection(); //muda essa linha

Perfeita a sua análise. Manda ele instanciar uma interface, justamente a java.sql.Connection.
Tu sabe implementar todos os métodos dela? Tratar todos os close e etc? :slight_smile:
Amigo, tome cuidado com o que ensinas.

Master.Abs:

Eu faria o seguinte, nesse método conectarBanco eu retornaria um Connection
public Connection conetarBanco(){ return conn;}

e ao invés de chamar stm = conn.prepareStatement(“INSERT INTO funcionario (Funcao, nome, CPF, Endereco) values (?,?,?,?)”);
chame o conectarBanco.preparedStatement…

Pois creio que quando voce chama conn está chamando apenas a referencia e a referencia está nula.

Bom creio que seja isso.

Se ele não conseguir conectar ao banco o problema será exatamente o mesmo.
O maior problema aqui é ele simplesmente não tratar uma possível exceção durante a conexão, simples assim.

E

Master.Abs
Realmente, mudar o método conectarBanco() retornando um conn arrumou meu problema.
Obrigado pela ajuda de todos vocês.

  • uma vez o forum aqui me quebrando um galhão. Valeu gente!
Criado 22 de agosto de 2011
Ultima resposta 23 de ago. de 2011
Respostas 7
Participantes 5