【问题标题】:java.lang.NumberFormatException using parseIntjava.lang.NumberFormatException 使用 parseInt
【发布时间】:2020-10-29 15:53:09
【问题描述】:

我正在尝试从字符串中获取一个数字并对其执行操作。这是我正在处理的相关代码(已更新):

    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)

【问题讨论】:

  • 267574698286122 可能太大而不能成为int
  • @hev1 但他使用它:currentNum = parseInt(....); 和后来的sum = sum + currentNum;(但我承认这很混乱,因为 parseInt 之前的换行符)

标签: java


【解决方案1】:

问题是您尝试格式化的范围字符串大于int 的范围。

要解决这个问题,你需要将Integer.parseInt(cardNumber.substring(i));这一行改为Long.parseLong(cardNumber.substring(i));

查看不同数据类型的范围here。您还可以看到,对于 int,请参阅 here Integer.MIN_VALUEInteger.MAX_VALUE 对于long,请参见here Long.MIN_VALUELong.MAX_VALUE

更新

根据更新的问题,传递的字符串是64406849400888,因此i 的有效索引是0 &lt;= i &lt;= 13。除了上面的代码看起来不错。 64406849400888 可以在 long 中解析。见it the parsing here

【讨论】:

  • 嗨!我刚刚尝试过,我收到了类似的错误消息!只是为了确保代码应该看起来像这样,对吗? while (i &lt;= 15) { currentNum = Long.parseLong(cardNumber.substring(i)); if (i % 2 == 0) { //currentNum = Integer.parseInt(cardNumber.charAt(i)); currentNum = currentNum * 2; if (currentNum &gt; 9) { currentNum = currentNum - 9; sum = sum + currentNum; } else { //currentNum = Integer.parseInt(cardNumber.charAt(i)); sum = sum + currentNum; } i++; }.
  • 抱歉之前评论的格式,它不会让我修复任何东西。
  • @JennaCrist currentNumsum 的类型是什么。它也应该是long
  • 他们都是long类型!
  • @JennaCrist 你能在这里添加更新的代码和异常日志吗?
【解决方案2】:

您说您正在尝试从字符串中获取“a”数字。如果确实如此,并且您尝试一次检查一个数字 cardNumber,那么您需要 cardNumber.substring(i, i+1) 而不是 cardNumber.substring(i)

阅读 substring(int)substring(int, int) 的 javadocs 以了解原因。

【讨论】:

    【解决方案3】:

    问题在于整数的域在 [-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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2020-05-12
      • 2013-10-02
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多