当前位置: 首页 > 知识库问答 >
问题:

将字符串转换为整数会向我抛出一个错误:(

穆浩皛
2023-03-14

我正在尝试将字符串转换为整数,如下所示:

import java.util.Scanner;
import java.lang.*;
public class Assignment4
{
    public static void main(String[] args)
    {
        // introduce program
        System.out.println("\n========================");
        System.out.println("Card Number Verification");
        System.out.println("========================\n");
        System.out.println("Enter 16 digit card number (no spaces): ");

        Scanner sc = new Scanner(System.in); // initialize scanner

        // intialize any relevant variables
        int sum = 0; // sum for all digits in card number
        int new_card_number; // relevant variable

        String card_string = sc.nextLine(); //get users card number
        int length = card_string.length(); // get length of number

        // verify that it is 16 numeric characters
        if (length != 16 || card_string.matches("\\d+") == false)       
        {   
            System.out.println("Restart the program and enter a valid card    number.");
            System.exit(0);
        }
        int card_number = Integer.parseInt(card_string.trim());
        new_card_number = card_number; // ensures card_number doesnt change
        while (length > 0)
        {
            sum = sum + (new_card_number % 10);
            new_card_number = (new_card_number - (new_card_number % 10)) / 10;
            length--;
            System.out.println(new_card_number + sum);

        }
    }
}

下面是我得到的错误:

========================
Card Number Verification
========================

Enter 16 digit card number (no spaces): 
1234123412341234
Exception in thread "main" java.lang.NumberFormatException: For input string: "1234123412341234"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at java.lang.Integer.parseInt(Integer.java:499)
    at Assignment4.main(Assignment4.java:28)

我尝试过使用trim选项或者直接输入字符串变量为“我nteger.parseInt(card_string)”。为什么我仍然收到这个错误?

共有3个答案

诸葛令
2023-03-14

正如其他人所指出的,您会遇到这种异常情况,因为卡号比int表示的数字大。

你似乎只是简单地对卡号的数字求和,显然是相反的(尽管只有当你在求和时打印出一些东西时,这才相关)。

要做到这一点,不需要将整个字符串解析为数字:

int sum = 0;
for (int i = card_number.length() - 1; i >= 0; --i) {
  sum += Character.getNumericValue(card_number.charAt(i));
  System.out.println(card_number.substring(0, i) + sum);
}

(请注意,trim是不必要的,因为您已经检查过它只是数字)

如果没有println,您可以更轻松地(自然地)执行以下操作:

int sum = 0;
for (int i = 0; i < card_number.length(); ++i) {
  sum += Character.getNumericValue(card_number.charAt(i));
}
郎喜
2023-03-14

int最大尺寸为2147483647。您正在尝试解析更大的数字12341234112341234。

可以使用long代替int

long card_number = Long.parseLong(card_string.trim());
权韬
2023-03-14

整数类型的值是以下范围内的整数:

[...]

  • 对于int,从-2147483648到2147483647,包括

你超出了这里的int值限制

Integer.parseInt(card_string.trim());

一个很好的解决方案是在处理非常大的数字时使用biginger

BigInteger myBigNumber = new BigInteger(card_string.trim());

许多操作都是可能的,如求和,乘法,等等。。。

资料来源:BigInteger JavaDoc

另一个解决方案是使用long而不是int。它是有限的,但限制相当高,请查看下面。

整数类型的值是以下范围内的整数:

[...]

从-9223372036854775808到9223372036854775807包容

 类似资料:
  • 问题内容: 如何在JavaScript中将字符串转换为整数? 问题答案: 最简单的方法是使用本机函数: 如果这对您不起作用,则有 parseInt , 一元加号 , 带有floor的parseFloat 和 Math.round 方法。 parseInt: 一元加号,如果您的字符串已经是整数形式: 如果您的字符串是浮点数或可能是浮点数,并且您想要一个整数: 或者,如果您要多次使用Math.floo

  • 问题内容: 有什么方法可以将null转换为Integer。null实际上是一个字符串,我在我的服务层中传递该字符串,将其接受为整数。因此,每当我尝试将null字符串强制转换为Integer时,都会引发异常。但是我必须将null转换为Integer。 问题答案: 您 不能 从String强制转换为Integer。但是,如果您尝试将字符串转换为整数,并且必须提供处理字符串的实现,请查看以下代码片段:

  • 问题内容: 给定一个数字: 将其转换为字符串的“最佳”方法是: 问题答案: 有多种方法: (我的偏爱) (我不知道编译器如何处理它,也许它和上面一样有效)

  • 问题内容: 我有一个整数 在声明中,我必须将其与一些字符串进行比较。我不能在开始时设置为字符串,因为必须在循环中将其递减。 如何转换? 问题答案: 我找到了答案。 将整数转换为字符串: 将字串转换为整数:

  • 问题内容: 有没有人能将不安全的字符串转换为? 该字符串通常回来为:或类似的东西。 在这种情况下,我要。如果我想。我从不希望该方法失败,但是我不愿意尝试,除非通过它只是为了隐藏错误(以防万一发生极端情况)。 问题答案: 在这种情况下,您确实有一种避免/的方法,尽管我不建议这样做(假设您的输入字符串名为,并且您处于必须返回某些内容的函数中): 将在部分就是你回什么是你想要比如说,如果是,空,全空间,

  • 问题内容: 我正在尝试从EditText字段中将两个数字加在一起。到目前为止,我有下面的代码,我相信它会将EditText字段“ pos1_deg”和“ pos2_deg”转换为整数deg1和deg2。 然后,我可以执行以下操作将它们添加在一起 然后degSum寄存器保存deg1和2的和。 然后要输出回“结果” EditText,我需要将整数degSum更改为字符串。我认为正确的方法是使用以下代码