[resolvido] java.lang.NullPointerException

não consigo achar o erro, ele acontece quando tento alterar alguma tarefa.

INFO: Conectannnnndo ao banco! INFO: 1 INFO: Primeira Tarefa!!! INFO: false WARNING: StandardWrapperValve[springmvc]: PWC1406: Servlet.service() for servlet springmvc threw exception java.lang.NullPointerException at br.com.caelum.tarefas.dao.TarefaDAO.altera(TarefaDAO.java:125) at br.com.caelum.tarefas.controller.TarefasController.altera(TarefasController.java:46) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) at javax.servlet.http.HttpServlet.service(HttpServlet.java:755) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722)

o jsp de alteração é esse:

[code]<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>
<%@ taglib tagdir="/WEB-INF/tags" prefix=“listagem” %>

<c:import url="…/header.jsp" />

<c:forEach var="tarefa" items="${tarefas}">

	<h1>Alterar Tarefa - ${tarefa.id}</h1>
	
	<form action="alteraTarefa" method="post" varStatus="id">
	    <p class="form1">
	        <label>Descrição:</label>
	        <textarea name="descricao" class="textarea">${tarefa.descricao}</textarea>
	    </p>
	    <p class="form1">
	        <label>Finalizado?</label>
	        <input type="checkbox" name="finalizado" value="true" ${tarefa.finalizado ? 'checked' : ''} />
	    </p>
	    <p class="form1">
	        <label>Data de Finalização:</label>
	        <fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy" />
        	<listagem:campoData id="dataFinalizacao" />
	    </p>
	    <p class="form1-but">
	    	<input type="hidden" name="id" value="${tarefa.id}" />
	        <input type="submit" value="Alterar" class="but" />
	    </p>
	</form>
	
</c:forEach>

<br clear="all" />

<c:import url="…/footer.jsp" />[/code]

quando clico em alterar ele chama o controller:

[code]@RequestMapping(“alteraTarefa”)
public String altera(@Valid Tarefa tarefa, BindingResult result) {

	if (result.hasErrors()) { // erro no formulario inteiro
		return "tarefa/formulario";
	}
	
	TarefaDAO dao = new TarefaDAO();
	dao.altera(tarefa);
	return "index";
}[/code]

que chama o DAO:

[code]public void altera(Tarefa tarefa) {
System.out.println(tarefa.getId());
System.out.println(tarefa.getDescricao());
System.out.println(tarefa.isFinalizado());
System.out.println(tarefa.getDataFinalizacao().getTimeInMillis());

    try {
        String sql = "UPDATE tarefas SET descricao=?, finalizado=?, dataFinalizacao=? WHERE id=?";
        PreparedStatement stmt = connection.prepareStatement(sql);
        stmt.setString(1, tarefa.getDescricao());
        stmt.setBoolean(2, tarefa.isFinalizado());
        if(tarefa.getDataFinalizacao() != null) {
        	stmt.setDate(3, new Date(tarefa.getDataFinalizacao().getTimeInMillis()));
        } else {
        	stmt.setDate(3, null);
        }
        stmt.setLong(4, tarefa.getId());
        stmt.execute();
        stmt.close();
        System.out.println("DADOS ALTERADOS COM SUCESSO!");
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}[/code]

o println mostra que os valores estão sendo passados.

alguém pode me ajudar a encontrar o problema?

obrigado.

java.lang.NullPointerException at br.com.caelum.tarefas.dao.TarefaDAO.altera(TarefaDAO.java:125) at br.com.caelum.tarefas.controller.TarefasController.altera(TarefasController.java:46)

O que acontece nas linhas especificadas dentro dos parenteses?

cara que loucura, voltou a funcionar.
acho que eram resgistros que não tinham todos os campos preenchidos.
putz :slight_smile:
só não vou fechar o topico agora pq não tenho certeza.
mas logo logo eu fecho se estiver tudo certo.
muito obrigado pela resposta digão.

Se a dataFinalicacao é null, isto vai dar NullPointerException:

System.out.println(tarefa.getDataFinalizacao().getTimeInMillis());

sim pmlm foi isso mesmo :slight_smile: