我有一个字符串输入,我试图将其转换为字符数组,然后以一种可以让我在信用卡程序中使用它们的方式存储该数组中的数字。这就是我目前正在尝试这样做的方式。

我目前在处收到Null Pointer Exception:

charDigits[x - invalid] = charInput[x];


我需要能够从字符串输入中使用信用卡算法上的整数。

public class testFunction {
    private char[] charInput;
    private char[] charDigits;
    private int[] intInput;
    private int invalid = 0;
    private String input = "125-6543-3356";

    public testFunction()
    {
        charInput = input.toCharArray();

        for(int x = 0; x < charInput.length; x++)
        {
            if (charInput[x] == '0' || charInput[x] == '1' || charInput[x] == '2' || charInput[x] == '3' || charInput[x] == '9' ||
                charInput[x] == '4' || charInput[x] == '5' || charInput[x] == '6' || charInput[x] == '7' || charInput[x] == '8')
            {
                charDigits[x - invalid] = charInput[x];
            }
            else
            {
                invalid++;
            }
            System.out.println("charDigits: " + x + ": " + charDigits[x] );
        }

        for(int i = 0; i < charDigits.length; i++)
        {
            intInput[i] = Integer.parseInt(charDigits[i] + "");
        }
    }

        public static void main(String[] args)
        {
            testFunction test = new testFunction();
        }
}

最佳答案

我看不到您在任何地方初始化charDigits。它的初始值为null,因此像charDigits[i]一样访问它会产生一个NPE(您应该能够根据NullPointerException的文档轻松推断出它)。您需要先将charDigits初始化为任意大小的数组(看起来最大大小将为charInput.length):

charDigits = new char[charInput.length];


但是,为了使其余逻辑正常工作,您还需要跟踪charDigits中实际上有效的位数(因为最终它可以比charInput短)。您有很多选择:


考虑在肯定情况下执行valid++而不是否定情况下的invalid++,并通过charDigits[valid]而不是[x - invalid]进行索引。在循环结束时,valid将包含复制到charDigits的字符数,并且intInput可以相应地初始化。
由于charDigits的元素将被初始化为0,因此在intInput时停止复制到charDigits[i] == 0
charDigits使用动态数组(例如ArrayList<Character>),并根据需要附加。
StringBuilder使用charDigits或其他名称,然后根据需要追加。
等等。

10-08 03:53