Java 输入长串数字时不断出错

Java 输入长串数字时不断出错,java,string,numbers,space,Java,String,Numbers,Space,因此,我的程序应该采用Visa卡或万事达卡使用的16位数字的附加形式。但是,当我运行它时,程序将读取一个空格作为输入的结尾。 例如:如果我输入1234 5678 9012 3444,程序只会在我输入空格之前添加数字的总和。然后,如果我输入整个字符串而没有空格,它会一直给我错误代码。我做错了什么 import java.util.Scanner; public class assignment4 { public static void main(String[] args) {

因此,我的程序应该采用Visa卡或万事达卡使用的16位数字的附加形式。但是,当我运行它时,程序将读取一个空格作为输入的结尾。 例如:如果我输入1234 5678 9012 3444,程序只会在我输入空格之前添加数字的总和。然后,如果我输入整个字符串而没有空格,它会一直给我错误代码。我做错了什么

import java.util.Scanner;

public class assignment4
{

public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        int sum = 0, number, modulo;
        String cardBrand;
        System.out.print("Visa or MasterCard? ");
        cardBrand = in.nextLine();

        System.out.print("Please enter your 16 digit credit card number (no spaces): ");
        number = in.nextInt();

        while (number > 0)
        {

            int digit = number % 10;
            sum = sum + digit;
            number = number/10;

        }

        modulo = (sum % 10);

        if (cardBrand.equals("Visa"))
        {
            if (modulo == 0)
            {
                System.out.println("This is a valid Visa card. Good job.");
            }
            else
            {
                System.out.println("This is an invalid Visa card number.");
            }
        }
        else if (cardBrand.equals("MasterCard"))
        {
            if (modulo == 1)
            {
                System.out.println("This is a valid MasterCard.");
            }
            else
            {
                System.out.print("This is an invalid MasterCard card number.");
            }
        }

    }

}
int限制为2147483647,因此您的号码超出范围

如果您确实需要处理如此大的数字,请使用。

您应该使用nextLine读取所有数字,然后按空格分割

String line = in.nextLine();
String[] numbers = line.split(" ");

您可以检查接收到的下一个字符是否为整数,并将整数相加。这样,您就不会遇到int的大小问题,因为您将在收到每个int时求和

   int sum = 0, number = 0, modulo;
   while(in.hasNext()){
     if(in.hasNextInt()){
     number = in.nextInt();
     sum = sum + number;
   }
   else{
     in.next();
   }
   modulo = sum % 10;
Ctrl+Z或Ctrl+D是用于中断输入序列的字符

第一种解决方案:使用BigInteger类。它的构造函数输入是字符串

第二种解决方案:在String类中使用split方法或使用StringTokenizer类。 贝什写了一个分裂的例子。StringTokenizer示例:


谢谢你,但我想我的老师最想做的是输入1234 5567 3443 34343这样的数字,那么我如何让程序读取整行,而不仅仅是前4个数字呢?然后我建议你把数字读成字符串,浓缩它们,去掉空格,然后开始解析数字。哦。我想我现在记得怎么做了!谢谢,一般来说,我并不真正理解这种方法,但我确实理解其中的错误。in.nextInt将只读取您发现的第一个空格,这已经是一种糟糕的方法。Second in.nextInt读取一个int,int的最大值为2^31-1 see,或2147483647,这不足以容纳整数。此外,就确定卡类型而言,这并不准确。退房它链接到MOD 10/Luhn算法,还包括IIN编号,这些编号是确定卡类型所需的。
StringTokenizer st = new StringTokenizer ("1234 5678 9012 3444", " ");
st.nextToken() returns each part of your credit card number