Tipos Long

Pessoal,

Isso é meio que sem lógica mas alguem pode me ajudar?

Tenho um código que retorna a variavel com valor ou nula

	public long getInicioSub() {
		return inicioSub;
	} 
	public void setInicioSub(Long inicioSub) {
		if (inicioSub != null ) {
			this.inicioSub = inicioSub;
		}else {
			this.inicioSub = null;  //AKI PODERIA ATE SER UM ZERO MAIS ELE TAMBÉM NAO ACEITA QUE FAÇO ISSO: this.inicioSub = 0; 
		}
	}

Ai qndo vou compara-la em um if, ela não acheita que a compare como null somente como zero.

		        		if (sub.getInicioSub() != 0 && sub.getInicioSub() != null){
		        			
		        		}
// O ERRO ACONTECE QNDO FAÇO ISSO = sub.getInicioSub() != null

Existem dois tipos diferentes dentro do Java:

a) O tipo primitivo long, com letra minúscula, que representa números. Como não é um objeto, não pode ter valor nulo, ou ser comparado com nulo.
b) O tipo Long (com letra maiúscula), que é uma classe que contém um long dentro. Ela é usada para quando você precisa passar um objeto para uma função (como o caso das listas, por exemplo).

Provavelmente você declarou a variável inicioSub como Long, enquanto seu método getInicioSub() retorna o valor com o tipo primitivo long. Acontece que desde o Java 5, o java é capaz de fazer a conversão automática de um Long para um long, e vice-versa.

Para resolver seu problema, troque a declaração de inicioSub de Long para long, e atribua sempre 0 no lugar de null.

[quote=ViniGodoy]Existem dois tipos diferentes dentro do Java:

a) O tipo primitivo long, com letra minúscula, que representa números. Como não é um objeto, não pode ter valor nulo, ou ser comparado com nulo.
b) O tipo Long (com letra maiúscula), que é uma classe que contém um long dentro. Ela é usada para quando você precisa passar um objeto para uma função (como o caso das listas, por exemplo).

Provavelmente você declarou a variável inicioSub como Long, enquanto seu método getInicioSub() retorna o valor com o tipo primitivo long. Acontece que desde o Java 5, o java é capaz de fazer a conversão automática de um Long para um long, e vice-versa.

Para resolver seu problema, troque a declaração de inicioSub de Long para long, e atribua sempre 0 no lugar de null.[/quote]

Não funcionou continua dando o mesmo erro.

Pode postar o código completo?

CLASSE ContacaoDias

package model;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;

public class ContacaoDias {
	private ConexaoMysql conexaoMysql;
	
	public List<GSDiasSubtracao> Contacao(HttpServletRequest request, String id) {
		List<GSDiasSubtracao> subList = new ArrayList<GSDiasSubtracao>();       
		GSDiasSubtracao sub = new GSDiasSubtracao(); 
		
		conexaoMysql = new ConexaoMysql();     
	    Statement state = null;       
	    ResultSet rs = null;   
	    
   	    //Formata data em formatos do tipo dia(dd), mês(MM), ano(yyyy)
   		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
   		
   		try {
   			state = conexaoMysql.getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);       
	        rs = state.executeQuery("SELECT * from processos where idProcessos = "+id+"");
	        
	        while (rs.next()){
		        	String inicio         = rs.getString("real_inicioProcesso");
		        	String coleta         = rs.getString("real_envioColeta");
		        	String esclarecimento = rs.getString("real_esclarecimento");
		        	String propostas      = rs.getString("real_rectoPropostas");
		        	String analise        = rs.getString("real_analiseTecnica");
		        	String negociacao     = rs.getString("real_negocComercial");
		        	String homologacao    = rs.getString("real_homologacao");
		        	String contrato       = rs.getString("real_emissaoContrato");
		        	String aprovacao = null;
		
		            if (rs.getString("real_inicioProcesso") != null && rs.getString("real_inicioProcesso") != ""){
		            	if (rs.getString("real_aprovGAGG") != null && rs.getString("real_aprovGAGG") != ""){
		            		aprovacao = rs.getString("real_aprovGAGG");
			            }
			            if (rs.getString("real_aprovDIPL") != null && rs.getString("real_aprovDIPL") != ""){
			            	   aprovacao = rs.getString("real_aprovDIPL");
			               }
			               if (rs.getString("real_aprovDEEB") != null && rs.getString("real_aprovDEEB") != ""){
			            	   aprovacao = rs.getString("real_aprovDEEB");
			               }
			               if (rs.getString("real_aprovUsuario") != null && rs.getString("real_aprovUsuario") != ""){
			            	   aprovacao = rs.getString("real_aprovUsuario");
			               }
			               if (rs.getString("real_pautaDE") != null && rs.getString("real_pautaDE") != ""){
			            	   aprovacao = rs.getString("real_pautaDE");
			               }
			               if (rs.getString("real_emitirDDE") != null && rs.getString("real_emitirDDE") != ""){
			            	   aprovacao = rs.getString("real_emitirDDE");
			               }
		            }		        	
		        	
		        	if(inicio != null && inicio != ""){
		        		if (coleta != null && coleta != "") {
		        			//Parse efeuta a validação para saber se uma data é válida com o formato dado
				       		Date ini = sdf.parse(inicio);
				       		Date col = sdf.parse(coleta);
			       		
				       		//daysBetween
				       		//Subtrai as datas como números long, para descobrir o intervalo
				       		Long tempoInicio = col.getTime() - ini.getTime();
				       		//Calcula a quantidade de dias.
				       		Long tempoInicioTotal = ((((tempoInicio/1000))/60)/60)/24;
				       		
				            sub.setInicioSub(tempoInicioTotal);  
		        		}
		        		if(esclarecimento != null && esclarecimento != ""){
				       		Date escla = sdf.parse(esclarecimento);
				       		Date col2 = sdf.parse(coleta);

				       		Long tempoColeta = escla.getTime() - col2.getTime();
				       		Long tempoColetaTotal = ((((tempoColeta/1000))/60)/60)/24;
				       		
				            sub.setColetaSub(tempoColetaTotal); 
		        		}  
		        		if(propostas != null && propostas != ""){
				       		Date escla2 = sdf.parse(esclarecimento);
				       		Date prop = sdf.parse(propostas);

				       		Long tempoEsc = prop.getTime() - escla2.getTime();
				       		Long tempoEscTotal = ((((tempoEsc/1000))/60)/60)/24;
				       		
				            sub.setEsclarecimentoSub(tempoEscTotal); 
		        		} 
		        		if(analise != null && analise != ""){
				       		Date anal = sdf.parse(analise);
				       		Date prop2 = sdf.parse(propostas);

				       		Long tempoProp = anal.getTime() - prop2.getTime();
				       		Long tempoPropTotal = ((((tempoProp/1000))/60)/60)/24;
				       		
				            sub.setRectoPropostasSub(tempoPropTotal); 
		        		} 
		        		if(negociacao != null && negociacao != ""){
				       		Date anal2 = sdf.parse(analise);
				       		Date negoc = sdf.parse(negociacao);

				       		Long tempoAnal =  negoc.getTime() - anal2.getTime();
				       		Long tempoAnalTotal = ((((tempoAnal/1000))/60)/60)/24;
				       		
				            sub.setAnaliseTecnicaSub(tempoAnalTotal); 
		        		} 
		        		if(homologacao != null && homologacao != ""){
				       		Date hom = sdf.parse(homologacao);
				       		Date negoc2 = sdf.parse(negociacao);

				       		Long tempoNegoc = hom.getTime() - negoc2.getTime();
				       		Long tempoNegocTotal = ((((tempoNegoc/1000))/60)/60)/24;
				       		
				            sub.setNegocComercialSub(tempoNegocTotal); 
		        		}      		
		        		if(aprovacao != null && aprovacao != ""){
				       		Date hom2  = sdf.parse(homologacao);
				       		Date aprov = sdf.parse(aprovacao);
				       		Long tempoHomo = aprov.getTime() - hom2.getTime();
				       		Long tempoHomoTotal = ((((tempoHomo/1000))/60)/60)/24;
				       		
				            sub.setHomologacaoSub(tempoHomoTotal); 
		        		}
		        		if(contrato != null && contrato != ""){
				       		Date cont  = sdf.parse(contrato);
				       		Date aprov2 = sdf.parse(aprovacao);
				       		Long tempoAprov = cont.getTime() - aprov2.getTime();
				       		Long tempoAprovTotal = ((((tempoAprov/1000))/60)/60)/24;
				       		
				            sub.setAprovacaoSub(tempoAprovTotal); 
		        		}
		        		
		        		Long soma = null;
		        		
		        		if (sub.getInicioSub() != 0 && sub.getInicioSub() != null){
		        			soma = sub.getInicioSub();
			        		if (sub.getColetaSub() != 0 && sub.getColetaSub() != null){
			        			soma += sub.getColetaSub();
			        		}
			        		if (sub.getEsclarecimentoSub() != 0 &&  sub.getEsclarecimentoSub() != null){
			        			soma += sub.getEsclarecimentoSub();
			        		}
			        		if (sub.getRectoPropostasSub() != 0 && sub.getRectoPropostasSub() != null){
			        			soma += sub.getRectoPropostasSub();
			        		}
			        		if (sub.getAnaliseTecnicaSub() != 0 && sub.getAnaliseTecnicaSub() != null){
			        			soma += sub.getAnaliseTecnicaSub();
			        		}
			        		if (sub.getNegocComercialSub() != 0 && sub.getNegocComercialSub() != null){
			        			soma += sub.getNegocComercialSub();
			        		}
			        		if (sub.getHomologacaoSub() != 0 && sub.getHomologacaoSub() != null){
			        			soma += sub.getHomologacaoSub();
			        		}
			        		if (sub.getAprovacaoSub() != 0 && sub.getAprovacaoSub() != null){
			        			soma += sub.getAprovacaoSub();
			        		}
		        		}
		        		sub.setSomaSub(soma);
		        	} else{
		        	/*	inicio         = " - "; */
		        	}	 
		    }//fim while
   		}catch(Exception erro){
   			erro.printStackTrace();  
	        System.out.println("Erro ocorrido na classe ContacaoDias: n" + erro);       
	        return null; 
   		}finally{
   			if(state != null){   //fechar os statments     
		           try {     
		             state.close();     
		           } catch (SQLException e) {     
		             // TODO Auto-generated catch block     
		             e.printStackTrace();     
		           }       
		        }     
   		}
   		subList.add(sub);
		return subList;  
	}
}

Pode postar o código completo?[/quote]

CLASSE GSDiasSubtracao

package model;


public class GSDiasSubtracao {
	private Long inicioSub;
	private Long coletaSub;
    private Long esclarecimentoSub;
    private Long rectoPropostasSub;
	private Long analiseTecnicaSub;
    private Long negocComercialSub;
	private Long homologacaoSub;
    private Long aprovacaoSub;
    private Long emissaoContratoSub;
    private Long somaSub;
    
	public Long getSomaSub() {
		return somaSub;
	}
	public void setSomaSub(Long somaSub) {
		this.somaSub = somaSub;
	}
    
	public Long getColetaSub() {
		return coletaSub;
	}
	public void setColetaSub(Long coletaSub) {
		this.coletaSub = coletaSub;
	}
	
	public Long getInicioSub() {
		return inicioSub;
	} 
	public void setInicioSub(Long inicioSub) {
		if (inicioSub != null ) {
			this.inicioSub = inicioSub;
		}else {
			this.inicioSub = null;
		}
	}
	
	public Long getEsclarecimentoSub() {
		return esclarecimentoSub;
	}
	public void setEsclarecimentoSub(Long esclarecimentoSub) {
		this.esclarecimentoSub = esclarecimentoSub;
	}
	public Long getRectoPropostasSub() {
		return rectoPropostasSub;
	}
	public void setRectoPropostasSub(Long rectoPropostasSub) {
		this.rectoPropostasSub = rectoPropostasSub;
	}
	public Long getAnaliseTecnicaSub() {
		return analiseTecnicaSub;
	}
	public void setAnaliseTecnicaSub(Long analiseTecnicaSub) {
		this.analiseTecnicaSub = analiseTecnicaSub;
	}
	public Long getNegocComercialSub() {
		return negocComercialSub;
	}
	public void setNegocComercialSub(Long negocComercialSub) {
		this.negocComercialSub = negocComercialSub;
	}
	public Long getHomologacaoSub() {
		return homologacaoSub;
	}
	public void setHomologacaoSub(Long homologacaoSub) {
		this.homologacaoSub = homologacaoSub;
	}
	public Long getAprovacaoSub() {
		return aprovacaoSub;
	}
	public void setAprovacaoSub(Long aprovacaoSub) {
		this.aprovacaoSub = aprovacaoSub;
	}
	public Long getEmissaoContratoSub() {
		return emissaoContratoSub;
	}
	public void setEmissaoContratoSub(Long emissaoContratoSub) {
		this.emissaoContratoSub = emissaoContratoSub;
	}
	
}

O ERRO:

16/11/2009 09:22:38 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
	at org.apache.jsp.DHTMLXSuite.dhtmlxWindows.samples._01_005finit._08_005fattach_005fobject_005fadjust_jsp._jspService(_08_005fattach_005fobject_005fadjust_jsp.java:217)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at control.Detalhes.doGet(Detalhes.java:45)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
	at java.lang.Thread.run(Thread.java:619)
16/11/2009 09:22:38 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Detalhes threw exception
java.lang.NullPointerException
	at org.apache.jsp.DHTMLXSuite.dhtmlxWindows.samples._01_005finit._08_005fattach_005fobject_005fadjust_jsp._jspService(_08_005fattach_005fobject_005fadjust_jsp.java:217)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at control.Detalhes.doGet(Detalhes.java:45)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:837)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
	at java.lang.Thread.run(Thread.java:619)

O problema é que o valor da variável inicioSub é nulo. Então, o primeiro teste inicioSub != 0 vai tentar converter a variável para um número, e isso gera uma NullPointerException. Para corrigir, inverta o teste:

sub.getInicioSub() != null && sub.getInicioSub() != 0