Java.lang.nullPointerException (Ajuda)

6 respostas
M

Pessoal, alguém pode me ajudar a encontrar onde pode estar ocorrendo esta exceção?

Quando eu rodo no browser do eclipse, nenhum erro acontece e roda tudo certo, mas qdo rodo no servidor aparece sempre uma exceção do tipo java.lang.nullPointerException.
Não estou conseguindo achar onde pode estar o problema no código. Por favor me ajudem, não consigo mais escutar reclamação dos usuários, pois sempre qdo executado o sistema roda e de repente sai fora e lança a exceção na tela. O interssante é que qdo se atualiza a tela pelo (F5), de vez enquando roda tudo certo, o que pode ser isso.

Esse é o meu código.

package servletsPortalAc;

import java.sql.Statement;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import util.*;


public class PesquisaSql extends HttpServlet {

	@SuppressWarnings("deprecation")
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException, ParseException {

		response.setContentType("text/html;charset=ISO-8859-1");

		PrintWriter out = response.getWriter();
		
		//INICIA AS VARIÁVEIS PARA RECEBER OS VALORES
		
		String retorno = "";
		String bgcolorPrazo = "";
		String dataPreFormatada = "";
		//String tdpPos = "";
		String dt_pesq = "";
		String dt_pesq1 = "";
		String reu_pre = "";
		String nbrPos = "";
		String nbrMe = "";
		String antecipa = "";
		String emissor = "";
		String status = "";
		String projeto = "";
		String tecnologia = "";
		String tipo = "";
		String modoFalha = "";
		String motivo = "";

		
		dt_pesq = request.getParameter("dt_pesq");
		dt_pesq1 = request.getParameter("dt_pesq1");
		reu_pre = request.getParameter("reu_pre");
		nbrPos = request.getParameter("pos");
		nbrMe = request.getParameter("me");
		antecipa = request.getParameter("antecipa");
		emissor = request.getParameter("emissor");
		status = request.getParameter("status");
		projeto = request.getParameter("projeto");
		tecnologia = request.getParameter("negocio");
		tipo = request.getParameter("tipo");
		modoFalha = request.getParameter("modoFalha");
		motivo = request.getParameter("motivo");

		//INICIA DATA DE HOJE
		String hoje = util.FormatadorDatas.data_hora(); 
		try{
		 if (dt_pesq==null && dt_pesq1==null && nbrPos==null && nbrMe==null && antecipa==null && emissor==null && status==null && projeto==null && tecnologia==null){
		    	//retorno = (String) request.getParameter("retorno");
			 retorno = (String) request.getSession().getAttribute("retornoSession");
		    	//retorno = (String) session.getValue("retornoSession");
		    	//out.println(retorno);
		    }	
		    else
		    {
		
		String dataFormPesq = "";
	    String dataFormPesq1 = "";
	    
	    if (!dt_pesq.equals("") && !dt_pesq1.equals("")){
	    Date data_pesq = new SimpleDateFormat("dd-MM-yyyy").parse(dt_pesq);   
		dataFormPesq = new SimpleDateFormat("yyyy-MM-dd").format(data_pesq);  
		
		Date data_pesq1 = new SimpleDateFormat("dd-MM-yyyy").parse(dt_pesq1);   
		dataFormPesq1 = new SimpleDateFormat("yyyy-MM-dd").format(data_pesq1);
	    }
		    

	    // monta um array com as opções de pesquisa
	    List<String> lista = new ArrayList<String>();   
	    
	    if(dataFormPesq!=null && reu_pre==null)
		  	   lista.add("data>='"+dataFormPesq+"'");
		    if(dataFormPesq1!=null && reu_pre==null)
		  	   lista.add("data<='"+dataFormPesq1+"'");
		    if(dataFormPesq!=null && reu_pre!=null)
		   	   lista.add("data_pre>='"+dataFormPesq+"'");
		    if(dataFormPesq1!=null && reu_pre!=null)
		   	   lista.add("data_pre<='"+dataFormPesq1+"'");
		    if(!nbrPos.equals(""))
		 	   lista.add("pos = '"+nbrPos+"'");
		    if(!nbrMe.equals(""))
		  	   lista.add("me like '%"+nbrMe+"%'");
		    if(!antecipa.equals(""))
		  	   lista.add("antecipa = '"+antecipa+"'");
		    if(!emissor.equals(""))
		 	   lista.add("emissor = '"+emissor+"'");
		    if(!status.equals("Todos")&& !status.equals(""))
		    	   lista.add("status = '"+status+"'");
		    if(status.equals("Todos"))
		     	   lista.add("status != '-' and status!='' ");
		    if(!tecnologia.equals(""))
		   	   lista.add("negocio = '"+tecnologia+"'");
		    if(motivo.equals("Todos"))
		     	lista.add("motivo != '-' and motivo!='' ");
		    if(!motivo.equals("Todos") && !motivo.equals(""))
		         lista.add("motivo = '"+motivo+"'");
		    if(!tipo.equals(""))
		        lista.add("tipo = '"+tipo+"'");
		    
	  
	    StringBuilder sb = new StringBuilder();     
	    for(String s : lista){     
	       sb.append(" and ").append(s);     
	    }
	    retorno = sb.toString().replaceFirst("and", "");  
	    }
	    request.getSession().setAttribute("retornoSession", retorno);
	    
	    //out.println(retorno);
	    
		} catch (Exception e) {
			 e.printStackTrace();

		 }
	    
	  //ABRE CONEXÃO COM O BANCO
		ConexaoUtil c = new ConexaoUtil();
	
		
	String totalRows = "";
	Integer limit = 50;
	    
	List<AcAta> listaConsulta = new ArrayList<AcAta>(); 
	List<AcAta> listaConsultaWf = new ArrayList<AcAta>(); 
	try{	
	    ResultSet rs_count = c.executeConsulta("SELECT COUNT(*) AS c FROM ac_ata where" +retorno+ "");
		rs_count.next();
		
	    totalRows = (rs_count.getString("c"));

			ResultSet rs_lista = c.executeConsulta("SELECT * FROM ac_ata where" +retorno+ " order by data LIMIT " + limit);
			
			while(rs_lista.next()){
				
			    	AcAta acAta = new AcAta();
			    	acAta.setNbrAc(rs_lista.getString("id_ata"));
			    	acAta.setDtCriacao(rs_lista.getDate("data"));
			    	acAta.setPos(rs_lista.getString("pos"));
			    	acAta.setMe(rs_lista.getString("me"));
			    	acAta.setAntecipaAta(rs_lista.getString("antecipa"));
			    	acAta.setAssuntoAta(rs_lista.getString("assunto"));
			    	acAta.setEmissorAta(rs_lista.getString("emissor"));
			    	acAta.setStatusAta(rs_lista.getString("status"));
			    	acAta.setNegocioAta(rs_lista.getString("negocio"));
			    	acAta.setProjetoAta(rs_lista.getString("projeto"));
			    	acAta.setTipoRet(rs_lista.getString("tipo_ret"));
			    	acAta.setTipoAta(rs_lista.getString("tipo"));
			    	acAta.setChaveAta(rs_lista.getString("chave"));
			    	acAta.setModoFalhaAta(rs_lista.getString("modo_falha"));
			    	acAta.setMotivoAta(rs_lista.getString("motivo"));
			    	acAta.setDataPre(rs_lista.getDate("data_pre"));
			    	
			    	//listaConsulta.add(acAta);

					//for(AcAta resultado : listaConsulta){ 
				try{		
					if(acAta.getDataPre()==null){
					acAta.setBgcolorPrazo("class=rowpos");
					//listaConsulta.add(acAta);

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

			 }
					
			try{
			       if(acAta.getDataPre()!=null){
				    acAta.setDataPreFormatada(FormatadorDatas.formatoBrasil_sem_hora(acAta.getDataPre()));
				    acAta.setFarolDataPre(FormatadorDatas.getDiferencaDiasPrazo(acAta.getDataPre()));

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

			 }
			
			try{
					if (acAta.getFarolDataPre() > 5){
						acAta.setBgcolorPrazo("bgcolor=#00FF00");
					}
					if (acAta.getFarolDataPre() <= 5 && acAta.getFarolDataPre() >= 1){
						acAta.setBgcolorPrazo("bgcolor=#FFFF00");
					}
					if (acAta.getFarolDataPre() <= 0){
						acAta.setBgcolorPrazo("bgcolor=#FF0000");
					}
			} catch (Exception e) {
				 e.printStackTrace();

			 }
				    
					    //inicio 2º try/catch consulta	
					    /*try{
					    	ResultSet rs_tdp = c.executeConsulta("SELECT * FROM tdp_ata where pos='"+acAta.getPos()+"' order by pos");
					    	if(rs_tdp.first()){
					    		tdpPos = "Sim";
					    	}
					    } catch (SQLException e) {
					    	e.printStackTrace();
					    }*/	
					  //fim 2º try/catch consulta	

					 //inicio 3º try/catch consulta
					 int total_com_emi = 0;
					 try{
						 ResultSet rs_emissor = c.executeConsulta("SELECT COUNT(*) AS com_emi FROM ac_historico where (id_ata = '"+acAta.getNbrAc()+"' and area='Emissor') order by area");
						 if (rs_emissor.next()){

						 acAta.setTotalCommentEmi(Integer.parseInt(rs_emissor.getString("com_emi")));	
						 //out.println(acAta.getTotalCommentEmi());
						 
						 }

					 } catch (SQLException e) {

						 e.printStackTrace();
					 }
					 //fim 3º try/catch consulta

				 //inicio 4º try/catch consulta 
				 String en = "";
				 try{
					 ResultSet rs_en = null;
					 rs_en = c.executeConsulta("SELECT * FROM cqa where (en = '"+acAta.getMe()+"') order by en");
					 if(rs_en.first())
					 {

						 en = rs_en.getString("en");
						 
					 } 
					 else {

						 en = "none";
					 }

				 } catch (SQLException e) {
					 e.printStackTrace();
				 } 
				 //out.println(en);
				//fim 4º try/catch consulta

					  //inicio 5º try/catch consulta	
					  if (!en.equals("none")){
						  //Date data_max = null;
						  String dataCqa = "";	  
						  try{	  
							  ResultSet rs_max = null;
							  rs_max = c.executeConsulta("SELECT max(prazo) as data_max FROM cqa_workflow where (en = '"+en+"') and prazo IS NOT NULL GROUP BY en ORDER BY max(prazo)ASC");
							  if(rs_max.first()){
								Date data_max = rs_max.getDate("data_max");
				//fim 5º try/catch consulta	 

					 //inicio 6º try/catch consulta	
					 String dataPreMaior = "";
					 try{
						 if (data_max!=null && !data_max.equals("")){
							 dataCqa = FormatadorDatas.formatoBrasil_sem_hora(data_max);

							 acAta.setFarolDataMax(FormatadorDatas.getDiferencaDiasPrazo(data_max));

							 //out.println(bgcolorPrazo); 
						 }
					 } catch (Exception e) {
						 e.printStackTrace();

					 }
					 try{
						 if(acAta.getDataPre()==null && data_max==null){

							 dataPreMaior = "-";
							 //out.println("1");
						 }
					  } catch (Exception e) {
							 e.printStackTrace();

						 }
					  try{
						 if(data_max==null){

							 dataPreMaior = dataPreFormatada;
							 //out.println("3");
						 }
			           } catch (Exception e) {
				      e.printStackTrace();

			          }
			           try{
						 if(acAta.getDataPre()==null){

							 dataPreMaior = dataCqa;

							 if (dataCqa==null){

								 dataPreMaior = "-";

							 }
							 //out.println("4");
						 }
					} catch (Exception e) {
					e.printStackTrace();

					}
					try{ 
						 if(acAta.getDataPre()!=null && data_max!=null){
							 
							 //out.println(data_max);
							 //out.println(acAta.getDataPre());
							 
							 if(data_max.after(acAta.getDataPre())||data_max==null){

								 dataPreMaior = dataCqa;
								 //out.println("5");
							 }
							 else{
								 dataPreMaior = dataPreFormatada;
								 //out.println("6");
							 }
						 }
					 } catch (Exception e) {
						 e.printStackTrace();
					 }	 
						 try{	 
							 if (dataPreMaior==null){

								 dataPreMaior = "-";
								 //out.println("7");
							 }
						 } catch (Exception e) {
							 e.printStackTrace();

						 }
						 out.println(data_max);
							  }
							  
						  } catch (SQLException e) {
							  e.printStackTrace();
						  }  
					 }
					  
					  listaConsulta.add(acAta);
					 
		     	  }
			 
			 for(AcAta resultado : listaConsulta){ 
					
					//out.println(resultado.getAreaAc()+"<br/>");
					//out.println(resultado.getStatusAc()+"<br/>");
					
		try{		
		 ResultSet rs_areas = c.executeConsulta("SELECT * FROM ac_workflow where (id_ata = '"+resultado.getNbrAc()+"') order by id_wf asc");

					  while(rs_areas.next()){
						  
						  AcAta acAta = new AcAta();
						  acAta.setNbrAcWf(rs_areas.getString("id_ata"));
						  acAta.setAreaAc(rs_areas.getString("area"));
						  //out.println(rs_areas.getString("area"));
						  acAta.setStatusAc(rs_areas.getString("status"));

						  ResultSet rs_com = c.executeConsulta("SELECT COUNT(*) AS com FROM ac_historico where (id_ata = '"+resultado.getNbrAc()+"' and area='"+acAta.getAreaAc()+"') order by area");
						  if (rs_com.next()){

						  acAta.setTotalComment(Integer.parseInt(rs_com.getString("com")));	  
						  //out.println(acAta.getTotalComment());
						  }
						  listaConsultaWf.add(acAta);
						   
					  }	
		} catch (SQLException e) {
			 //out.println("Data Nula ou não existe");
			 e.printStackTrace();
			 
		 }	
			 }
			
	 } catch (SQLException e) {
		 //out.println("Data Nula ou não existe");
		 e.printStackTrace();
		 
	 }	
	 
	 c.fechaConexao();
			//HttpSession session=request.getSession(true);
			request.setAttribute("listaConsulta",listaConsulta);
			request.setAttribute("listaConsultaWf",listaConsultaWf);

			String nextJSP = "/ac/acPesquisa_sql.jsp?totalRows="+totalRows;
			RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
			dispatcher.forward(request,response);
 
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Desde já agradeço a ajuda

6 Respostas

M

Pessoal, o erro que acontece é esse:

Jun 10, 2010 6:01:09 PM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet PesquisaSql threw exception

java.lang.NullPointerException

at com.mysql.jdbc.Statement.executeQuery(Statement.java:1247)

at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)

at util.ConexaoUtil.executeConsulta(ConexaoUtil.java:41)

at servlets.PesquisaSql.processRequest(PesquisaSql.java:390)

at servlets.PesquisaSql.doPost(PesquisaSql.java:439)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)

at java.lang.Thread.run(Unknown Source)
F

O erro está na linha 41 da classe util.ConexaoUtil.

util.ConexaoUtil.executeConsulta(ConexaoUtil.java:41)

Para mais detlahes, envie o código do ConexaoUtil.

Uma sugestão, vc digitou muita coisa dentro do método processRequest(…).
O problema nem é a quantidade de coisas (é sim tb) mas as tarefas de diferentes natureza q vc delega a este único método dentro desta única classe. Divida estas terefas com outros métodos e com outras classes.

Aquela inicilização das Strings é desnecessária e cria na memória objetos que nunca serão usados. Como log abaixo vc seta os valores das Strings vc pode tornar o código mais legível se declarar e setar os valores delas na mesma linha. Sem usar “”.

M

fvslistas , obrigado pelas explicações.

Segue o código ConexãoUtil.

Ei, poderia me ajudar a dividir as tarefas desta classe, como vc faria?

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ConexaoUtil {
	private static Connection c;
	private static Statement st;
	private static DataSource ds;
	private static ResultSet rs;
	
	public ConexaoUtil(){
		
		abreConexao();
		
	}
	public void abreConexao(){
		try {
			InitialContext ctx = new InitialContext();
			DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/bdportal");
			
			c = ds.getConnection();
			//System.out.println(c);
		//Class.forName("com.mysql.jdbc.Driver");         

		//c = DriverManager.getConnection("jdbc:mysql://localhost/agenda?zeroDateTimeBehavior=convertToNull"); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ResultSet executeConsulta(String sql) throws SQLException {

		    st = c.createStatement();
			rs = st.executeQuery(sql);
			return rs;
	}
	
	public int executeAtualizacao(String sql) throws SQLException {
		
		st = c.createStatement();
			int i = st.executeUpdate(sql);
			return i;
	}
	
	public void fechaConexao() {
		try {
			rs.close();
			st.close();
			c.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
F

Descomente a linha 29 do abreConexao
//System.out.println©;

Veja se será exibido null. Se isto acontecer, achamos o problema. E precisamos achar a sua causa.

Esse cara “java:comp/env/jdbc/bdportal” es’ta configurado corretamente. Acho que ele pode ser o problema.
Vc vai ter de ver no seu servidor se este carinha está configurado. Vai ter de ver tb se a chamada a ele está correta.
Se usar o Tomcat, acessa aqui: http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html

Quanto ao código, vai criando métodos conforme o tipo de tarefa sendo realizada.

  • inicializar variávesi com os parämetros,
  • conectar no banco
  • fazer consulta

  • coisas deste tipo

Crie métodos para cada grupo de tarefa.
Depois veja se tais métodos devem permanecer na mesma classe ou se devem migrar para novas classes.
Por exemplo, a classe que trata os dados que vêm das páginas não deve ser a mesma que trata das conexões com o banco de dados. São duas tarefas muito distintas.

M

fvslistas,

Descomentei a linha 29 e o sistema imprime isso:

jdbc:mysql://localhost:3306/piloto?autoReconnect=true&zeroDateTimeBehavior=convertToNull, UserName=piloto@localhost, MySQL-AB JDBC Driver

O context do servidor está assim:

<Context path="/Portal_Servlets">

 <Resource name="jdbc/bdportal" auth="Application"
	type="javax.sql.DataSource"
	driverClassName="com.mysql.jdbc.Driver"
	url="jdbc:mysql://localhost:3306/portal?autoReconnect=true&amp;zeroDateTimeBehavior=convertToNull"
	username="portal"
	password="teste"                  
	maxActive="150"
	maxIdle="20000"
	maxWait="120"
	validationQuery="select current_date"
	removeAbandoned="true"
    removeAbandonedTimeout="30"
    logAbandoned="true"/>
</Context>

O detalhe é que seu tiro essa part de código, não dá erro nenhum… Preciso dessa informação desta parte do código, pode me ajudar a buscar de outra maneira?

ResultSet rs_com = c.executeConsulta("SELECT COUNT(*) AS com FROM ac_historico where (id_ata = '"+resultado.getNbrAc()+"' and area='"+acAta.getAreaAc()+"') order by area");
						  if (rs_com.next()){

						  acAta.setTotalComment(Integer.parseInt(rs_com.getString("com")));	  
						  //out.println(acAta.getTotalComment());
						  }
F

Tem certeza de que não há nenhum outro erro antes? Pode ser o caso de ocorrer outro erro e este não ser exibido?

Tá muito difícil de ler o código. Faça a divisão em vários métodos. Assim vamos poder isolar o erro.

Criado 10 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 6
Participantes 2