Recebendo NumberFormatException depois de certa quantidade de caracteres

6 respostas
P

Olá,
Sou novo com programação e, para treinar, estou fazendo uma calculadora usando JavaFX.
Eu criei uma tela com uma serie de botões (igual uma calculadora) e um TextField para mostrar os inputs e resultados. Criei uma variável inteira e estou convertendo o conteúdo do TextField para Inteiro e armazenando naquela variável. Para testar coloquei um sysout nos botões para ver qual numero estava retornando.

Estava indo super bem, mas depois de uma certa quantidade de caracteres ele me retorna um NumberFormatException.

Segue a exceção:

Caused by: java.lang.NumberFormatException: For input string: "12121212121212121212"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Long.parseLong(Long.java:592)
	at java.lang.Long.parseLong(Long.java:631)
	at gui.MainViewController.onBt2Action(MainViewController.java:102)
	... 58 more

Alguém conseguiria me ajudar a resolver?

Edit: está aparecendo Long na exceção pois tentei converter primeiro em Inteiro, pensando que era limitação do inteiro, troquei para Double e depois Long.

6 Respostas

Jothar_Aleksander

Onde está o código? Sem a codificação que tu fez fica difícil ajudar.

staroski
Valor máximo de um long:   9223372036854775807
Valor que você usou:      12121212121212121212
P

Criei uma ação para cada botão, e como estou usando um textfield no JavaFX que só trabalha com Strings, estou “somando” as Strings e depois convertendo para int:

public void onBt1Action(ActionEvent event) {
        if (result != null){
            resetResults();
        }

        if(textField.getText() == null){
            textField.setText("1");

            text = textField.getText();
            if (operationPressed == true) {
                number2 = Integer.parseInt(textField.getText());
            } else {
                number1 = Integer.parseInt(textField.getText());
            }
        } else {
            text = textField.getText();
            textField.setText(text + "1");

            text = textField.getText();
            if (operationPressed == true) {
                number2 = Integer.parseInt(textField.getText());
            } else {
                number1 = Integer.parseInt(textField.getText());
            }
        }
        System.out.println(number1);
    }

Aquele sysout no final é a String de retorno da excesão… essa ação ocorre sempre que eu aperto o botão 1 na “calculadora”

P

Valor máximo de um long: 9223372036854775807
Valor que você usou: 12121212121212121212

Hmm… sabe alguma maneira de limitar o numero de caracteres escritos no TextField no JavaFX? Eu imaginava que o long recebia um valor maior kkk

P

Usei o código if (text.length() < 10) para saber se o TextField está ultrapassando quatidade de caracteres de um inteiro e parar a adição de novos numeros.
Já na hora de finalizar a operação matemática eu usei o codigo:

if (result > 999999999) {
        text = String.format("%d", result);
        int i;
        Integer first = Integer.parseInt(String.valueOf(text.charAt(0)));
        i = text.length() - 1;
        textField.setText("aprox " + first + "e" + i);
    } else {
        textField.setText((String.format("%d", result)));
    }

Convertendo números maiores que um inteiro para notação científica.
Acho que o meu problema com os Longs acabou kkkk

Se tiverem alguma dica para um iniciante, eu agradeço. Muito obrigado pela ajuda!

staroski

Um long possui 64 bits, logo o maior valor positivo binário que ele comporta é:

01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
 byte 7   byte 6   byte 5   byte 4   byte 3   byte 2   byte 1   byte 0

Em decimal isso equivale à:

9.223.372.036.854.775.807
Criado 11 de setembro de 2019
Ultima resposta 12 de set. de 2019
Respostas 6
Participantes 3