我试图将字符串转换为整数,如下所示:
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选项或直接输入字符串变量为'Integer.parseInt(card_string)'。为什么我仍然收到此错误?
答案 0 :(得分:2)
整数类型的值是以下范围内的整数:
[...]
- 对于int,从-2147483648到2147483647,包括
您超过此处的int
值限制
Integer.parseInt(card_string.trim());
一个很好的解决方案是在使用非常大的数字时使用BigInteger
。
BigInteger myBigNumber = new BigInteger(card_string.trim());
许多操作可能是sum
,multiply
等......
另一种解决方案是使用long
代替int
。它是有限的,但限制很高,请在下面查看。
整数类型的值是以下范围内的整数:
[...]
很长一段时间,从-9223372036854775808到9223372036854775807,包括在内
答案 1 :(得分:1)
int
最大尺寸为2,147,483,647。您正在尝试解析更大的数字1,234,123,412,341,234。
您可以使用long
代替int
long card_number = Long.parseLong(card_string.trim());
答案 2 :(得分:1)
正如其他人所说,您收到此例外是因为卡号比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));
}