java .lang.NumberFormatException с использованием parseInt - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь взять ди git из строки и выполнить над ней операции. Это соответствующий код, над которым я работаю (обновлено):

    String cardNumber;
    String curNum;
    long currentNum;
    int firstNum;
    int randNum;
    int i;
    long sum = 0; 

 while (i <= 15) {
            //Delete this line if it doesnt work
            currentNum = Long.parseLong(cardNumber.substring(i));
        if (i % 2 == 0) {
            //currentNum = Integer.parseInt(cardNumber.charAt(i));
            currentNum = currentNum * 2;
            if (currentNum > 9) {
                currentNum = currentNum - 9;
                sum = sum + currentNum;
            }
            else {
                //currentNum = Integer.parseInt(cardNumber.charAt(i));  
                sum = sum + currentNum;
            }   
            i++;
        }
        long lastVal = 10 - (sum % 10);
        char charNum = (char) lastVal;
        //add int to char statement here
        cardNumber = cardNumber + charNum;
    }
        System.out.println(cardNumber);

        userNum--;
    }

Код // - это еще один вариант, над которым я работал и не хотел терять, поэтому, если есть способ сделать это работать с этим, это здорово! Сообщение об ошибке, которое возвращает этот код:

Исключение в потоке «main» java .lang.NumberFormatException: для входной строки: «64406849400888» в java .base / java .lang.NumberFormatException. forInputString (NumberFormatException. java: 65) в java .base / java .lang.Long.parseLong (Long. java: 692) в java .base / java .lang.Long. parseLong (Long. java: 817) в MasterCardGenerator.main (MasterCardGenerator. java: 54)

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

Вы сказали, что пытаетесь взять "a" di git из строки. Если это действительно так, и вы пытаетесь исследовать cardNumber по одному di git за раз, тогда вам нужно cardNumber.substring(i, i+1) вместо cardNumber.substring(i).

Прочтите javadocs для substring(int) и substring(int, int), чтобы понять почему.

1 голос
/ 09 июля 2020

Проблема в том, что область значений целых чисел находится между [-2 ^ 31,2 ^ 31 [, на самом деле между [-2,147,483,648 до +2,147,483,647]. Возможное решение - проанализировать строку, используя Long.parseLong(arg)

public class Test{

     public static void main(String []args){
         System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE);
         System.out.println("Long.MAX_VALUE: " + Long.MAX_VALUE);
         Long var = Long.parseLong("267574698286122");
         System.out.println("Printing content of 'var': " + var);
     }
}

И результат будет:

Integer.MAX_VALUE: 2147483647
Long.MAX_VALUE: 9223372036854775807
Printing content of 'var': 267574698286122
1 голос
/ 09 июля 2020

Проблема в том, что строка диапазона, которую вы пытаетесь отформатировать, больше, чем диапазон int.

Чтобы решить эту проблему, вам необходимо заменить строку Integer.parseInt(cardNumber.substring(i)); на Long.parseLong(cardNumber.substring(i));.

См. Диапазон различных типов данных здесь . Также вы можете увидеть int см. здесь Integer.MIN_VALUE и Integer.MAX_VALUE и long см. здесь Long.MIN_VALUE и Long.MAX_VALUE

ОБНОВЛЕНО

Согласно обновленному вопросу, переданная строка - 64406849400888 поэтому допустимый индекс для i - 0 <= i <= 13. В остальном код выглядит нормально. 64406849400888 можно разобрать в long. См. здесь синтаксический анализ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...