java.lang.NumberFormatException: For input string: (Na servlet)

Pessoal, gostaria de uma ajuda sobre o seguinte:

Sou iniciante no Java.
Estou usando: Java Web + JSP + Servlet

Estou tentando trazer do BD o campo “fone” formatado ( no BD ele é gravado sem formatação). Quero mostrar no dataTable ele formatado apenas. Vi várias coisas, mas até o momento o que deu certo foi implementar no DAO um método que formata o campo.

Usei este exemplo aqui:

private static String format(String pattern, Object value) throws java.text.ParseException {
				       
        MaskFormatter mask;
        try {
            mask = new MaskFormatter(pattern);
            mask.setValueContainsLiteralCharacters(false);
            return mask.valueToString(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
	
	 public static void main(String[] args) throws java.text.ParseException {
	        String pattern = "##/###.###/####";
	        String numeroProcesso = "010000012018";
	        System.out.println(format(pattern, numeroProcesso));
	    }
	
	 	 
}

No console imprime PERFEITO conforme a máscara.

public ArrayList<JavaBeans> listarContatos() {
		// criando objeto para acessar classe javabeans
		ArrayList<JavaBeans> contatos = new ArrayList<>();
		String read = "select * from contatos order by idcon";

		try {
			Connection con = conectar();
			PreparedStatement pst = con.prepareStatement(read);
			ResultSet rs = pst.executeQuery();
			while (rs.next()) {
				// variaveis de apoio que recebem dados do banco
				String idcon = rs.getString(1);
				String nome = rs.getString(2);
								
				String pattern = "(##)####-####";
				String fone = format(pattern, rs.getString(3));
				System.out.println(fone);
								
				
				//String fone = rs.getString(3);
							
				String email = rs.getString(4);
				// populando o arraylist
				contatos.add(new JavaBeans(idcon, nome, fone, email));

			}
			con.close();
			return contatos;
		} catch (Exception e) {
			System.out.println(e);
			return null;
		}

	}

Já quando é enviado à SERVLET e ao listar no JSP(dataTable), tenho o seguinte erro:

HTTP Status 500 - javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.servlet.jsp.JspException: In &lt;formatNumber&gt;, value attribute can not be parsed into java.lang.Number: "(34)9984-0432"

Não entendi erro erro de conversão.
No BD o campo é varchar.

Mostro os dados dessa forma:

<td><c:out value="${contato.fone}" /></td>  

Agradeço quem puder clarear esse problema!

Revendo passo a passo achei a resposta dentro da minha servlet:

public class Controller extends HttpServlet {
	//private static final long serialVersionUID = 1L;
	DAO dao = new DAO();
	JavaBeans contato = new JavaBeans();

comentei esse private static final long serialVersionUID = 1L;
e rodou liso.
Vou descobrir o porque dessa linha de código. Depois que comentei ela não afetou mais nada não.
Gracias!

1 curtida

Não tem nada a ver…
Em algum momento você havia compilado seu jsp passando a variável do value entre os sinais < e >, por alguma coincidência, após alterar seu bean você acabou recompilando o jsp e te gerou a sensação de que a constante era o problema.

Bão demais?
Não alterei o Bean não, no caso o meu na camada model…
Fui refazendo o caminho linha por linha, métodos, pagina por página.
Em meu pensamento, liguei esse LONG com algum tipo de number, como dizia o numberFormat no erro. Fui no extinto e comentei.
A dúvida é: Esse trecho comentado me afeta em que? Uma vez que sou iniciante no java e sigo tutoriais para aprender.
Valeu pelo retorno e me desculpe se não entendi sua colocação.

Em Java, toda classe que implementa a interface Serializable deveria declarar explicitamente o atributo serialVersionUID, se você não declara explicitamente, o compilador gera um pra você em tempo de compilação, calculando um hash com base no nome e ordem dos membros da classe.
Na prática, não vai influenciar no seu Servlet.

Deixar de declarar essa constante vai ser problema se você serializar objetos.

Você pode estar por exemplo enviando um objeto serializado para outro computador e naquela máquina essa classe foi alterada e recompilada, ou seja, é uma versão diferente da classe do objeto enviado da máquina de origem, neste caso, a máquina virtual do computador de destino vai lançar InvalidClassException ao tentar desserializar o objeto.

1 curtida

Certo. Grato pela explicação! Show! Vou me aprofundar mais e entender os detalhes. Abraço!