ตัวเลขจากสตริงถึงอาร์เรย์ถ่านถึงอาร์เรย์ int

ฉันมีอินพุตสตริงและฉันกำลังพยายามแปลงเป็นอาร์เรย์อักขระ จากนั้นเก็บตัวเลขจากอาร์เรย์นั้นในลักษณะที่จะให้ฉันใช้ในโปรแกรมบัตรเครดิต นี่คือวิธีที่ฉันกำลังพยายามทำอยู่

ขณะนี้ฉันได้รับ 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();
        }
}

person Bizton    schedule 23.03.2014    source แหล่งที่มา
comment
ลองใช้บางอย่างเช่น if(c >= '0' && c <= '9') แทนที่จะผูกมัด || ทั้งหมดเข้าด้วยกัน ดังที่คุณเห็น ที่นี่ จุดโค้ดสำหรับ 0 ถึง 9 นั้นอยู่ติดกัน   -  person NameSpace    schedule 24.03.2014


คำตอบ (1)


ฉันไม่เห็นคุณเริ่มต้น 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 และต่อท้ายตามต้องการ
  • ฯลฯ
person Jason C    schedule 23.03.2014