2013-07-02 5 views
0

У меня есть проблемы с моим кодом: Теперь я использую StringBuilder для concatening даты, но я получаю некоторые ошибки: Мой Servlet:я получил ошибку java.lang.NullPointerException

package br.com.cad.basica; 

import java.util.Calendar; 

public class Contato { 

     private Long id; 
     private String nome; 
     private String sobrenome; 
     private String email; 
     private String endereco; 
     private Calendar dataNascimento1; 
     private Calendar dataNascimento2; 
     private Calendar dataNascimento3; 
     private String rg; 
     private String cpf; 
     private String sexo; 
     public Long getId() { 
      return id; 
     } 
     public void setId(Long id) { 
      this.id = id; 
     } 
     public String getNome() { 
      return nome; 
     } 
     public void setNome(String nome) { 
      this.nome = nome; 
     } 
     public String getSobrenome() { 
      return sobrenome; 
     } 
     public void setSobrenome(String sobrenome) { 
      this.sobrenome = sobrenome; 
     } 
     public String getEmail() { 
      return email; 
     } 
     public void setEmail(String email) { 
      this.email = email; 
     } 
     public String getEndereco() { 
      return endereco; 
     } 
     public void setEndereco(String endereco) { 
      this.endereco = endereco; 
     } 
     public Calendar getDataNascimento1() { 
      return dataNascimento1; 
     } 
     public void setDataNascimento1(Calendar dataNascimento1) { 
      this.dataNascimento1 = dataNascimento1; 
     } 
     public Calendar getDataNascimento2() { 
      return dataNascimento2; 
     } 
     public void setDataNascimento2(Calendar dataNascimento2) { 
      this.dataNascimento2 = dataNascimento2; 
     } 
     public Calendar getDataNascimento3() { 
      return dataNascimento3; 
     } 
     public void setDataNascimento3(Calendar dataNascimento3) { 
      this.dataNascimento3 = dataNascimento3; 
     } 
     public String getRg() { 
      return rg; 
     } 
     public void setRg(String rg) { 
      this.rg = rg; 
     } 
     public String getCpf() { 
      return cpf; 
     } 
     public void setCpf(String cpf) { 
      this.cpf = cpf; 
     } 
     public String getSexo() { 
      return sexo; 
     } 
     public void setSexo(String sexo) { 
      this.sexo = sexo; 
     } 




} 

Мой класс Contato (я не знаю, если необходимо реализовать некоторый код здесь)

package br.com.cad.servlet; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Date; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import br.com.cad.dao.Cadastro; 
import br.com.cad.basica.Contato; 

public class AddDados extends HttpServlet{ 

    protected void service(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 


PrintWriter out = response.getWriter(); 
    String nome = request.getParameter("nome"); 
    String sobrenome = request.getParameter("sobrenome"); 
    String rg = request.getParameter("rg"); 
    String cpf = request.getParameter("cpf"); 
    String sexo = request.getParameter("sexo"); 
    StringBuilder finalDate = new StringBuilder("DataNascimento1") 
.append("/"+request.getParameter("DataNascimento‌​2")) 
.append("/"+request.getParameter("DataNascimento3")); 

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
finalDate.toString(); 
Contato contato = new Contato(); 
    contato.setNome(nome); 
    contato.setSobrenome(sobrenome); 
    contato.setRg(rg); 
    contato.setCpf(cpf); 
    contato.setSexo(sexo); 
     if ("Masculino".equals(contato.getSexo())) { 
     contato.setSexo("M"); 
      } else { 
     contato.setSexo("F"); 
     } 

Cadastro dao = new Cadastro(); 
    dao.adiciona(contato); 
out.println("<html>"); 
out.println("<body>"); 
out.println("Contato " + contato.getNome() + " adicionado com sucesso"); 
out.println("</body>"); 
out.println("</html>"); 

} 
} 

Мой объект дао:

package br.com.cad.dao; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.sql.Date; 

import br.com.cad.dao.ConnectDb; 
import br.com.cad.basica.Contato; 
public class Cadastro { 

    private Connection connection; 


    public Cadastro() { 
     this.connection = new ConnectDb().getConnection(); 
    } 

    public void adiciona(Contato contato) { 
     String sql = "INSERT INTO dados_cadastro(pf_nome, pf_ultimonome, pf_rg, pf_cpf, pf_sexo,pf_dt_nasc) VALUES(?,?,?,?,?,?,?,?)"; 
     try { 

      PreparedStatement stmt = connection.prepareStatement(sql); 

      stmt.setString(1, contato.getNome()); 
      stmt.setString(2, contato.getSobrenome()); 
      stmt.setString(3, contato.getRg()); 
      stmt.setString(4, contato.getCpf()); 
      stmt.setString(5, contato.getSexo()); 
      stmt.setDate(6, new Date(contato.getDataNascimento1().getTimeInMillis())); 


      stmt.execute(); 
      stmt.close(); 
      System.out.println("Cadastro realizado com sucesso!."); 
     } catch(SQLException sqlException) { 
      throw new RuntimeException(sqlException); 
     } 
    } 
} 

Мой htmllet код cadastra.jsp (для передачи данных в мой сервлет и спас мою дб):

<...some code here 
    <label>Data de nascimento</label> 
      <br> 
       <select id="birthDay" name="dataNascimento1"> 
        <option selected="" value="">Dia</option> 
         <option value="01">1</option> 
         <option value="02">2</option> 
</select> 
       <select id="birthMonth" name="dataNascimento2"> 
        <option selected="" value="">Mês</option> 
         <option value="01">janeiro</option> 
         <option value="02">fevereiro</option> 
</select> 
       <select id="birthYear" name="dataNascimento3"> 
       <option selected="" value="">Ano</option> 
         <option value="2013">2013</option> 
         <option value="2012">2012</option> 
</select> 

Я получаю эту ошибку при нажатии кнопки отправки:

HTTP Status 500 - 

type Exception report 

message 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

java.lang.NullPointerException 
    br.com.cad.dao.Cadastro.adiciona(Cadastro.java:30) 
    br.com.cad.servlet.AddDados.service(AddDados.java:48) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.40 logs. 
+2

Столбец довольно специфичен: у вас есть «NullPointerException» в методе «Cadastro.adiciona», в строке 30. Это означает, что переменная в строке 30 имеет значение «null» и используется. Пожалуйста, ** научитесь читать stacktrace **. –

+0

И попытайтесь опубликовать ТОЛЬКО соответствующий код вместо полного кода. – kosa

+0

'NullPointerException', похоже, находится в строке, где вы вызываете' getDataNascimento1() '- вы уверены, что это всегда возвращает ненулевое значение? – andersschuller

ответ

2

Вы должны позвонить contato.setDataNascimento1(someDate) перед вами добавьте контакт (?). Проблема с этим утверждением:

contato.getDataNascimento1().getTimeInMillis() 

contato.getDataNascimento1() решает null на момент его выполнения.

подсчитывали линии и это утверждение в строке 30


Добавление

Вы должны заменить строки

private Calendar dataNascimento1; 
private Calendar dataNascimento2; 
private Calendar dataNascimento3; 

с

private Date dataNascimento; 

и соответствующим образом сменить геттеры/сеттеры. Теперь у вас есть одно поле, содержащее дату рождения контактов, и вы можете добавить его в инструкцию insert без дальнейшего преобразования.

Единственная оставшаяся проблема заключается в том, как создать объект Date на основе полученных значений из ui. Форматер - это способ сделать это. Но у Date есть некоторые удобные конструкторы для создания даты на основе таких значений. Остерегайтесь, что месяц основан на нуле, iaw, январь 0, февраль 1 и так далее. После того, как вы создали new Date(...), вы можете вызвать соответствующий сеттер в классе Contato и сохранить дату рождения на DTO.

+0

, но я сомневаюсь, что я только что связался с datanascimento1 + datanascimento2 + datascimento3 в моей последней версии finalbuild, как может добавить finaldate, содержащий 3 даты? contato.getFinalDate не работает, так что мне нужно? –

+0

У меня есть еще несколько сомнений. В вашем классе «Contato» есть три поля «Календарь» для даты рождения (?) И в день вашего магазина, месяц и год в полях (в виде строк) с одинаковыми именами. Это плохо вписывается.Создайте DTO для того, чтобы иметь * одно поле для дня рождения и * разобрать * конкатенированную строку в 'Date'. –

+0

Как я могу заменить его для одного поля? Я не понимаю ... –

Смежные вопросы