Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

keep getting this error Exception: in thread \"main\" java.lang.NullPointerExcep

ID: 3932765 • Letter: K

Question

keep getting this error Exception:

in thread "main" java.lang.NullPointerException

at CreditCard.validateCardNum(CreditCard.java:33)

at CreditCard.main(CreditCard.java:135)

here is the code

inside the CreditCardEvaluation.txt is below:

3158539628375348

3337465828248404

3112804683572030

3112804683572033

5435528978467581

code is below:

import java.io.File;

import java.io.PrintWriter;

import java.util.Scanner;

public class CreditCard

{

String value;

char valArray[];

int valid[];

int invalid[];

int reverse[];

int multipleOdd[];

int addDigits[];

int dropLast;

// constructor

public CreditCard(String cardNum)

{

if (cardNum.length() >= 13 && cardNum.length() <= 19)

{

value = cardNum;

}

valArray = new char[cardNum.length()];

valid = new int[valArray.length];

reverse = new int[valArray.length];

multipleOdd = new int[valArray.length];

addDigits = new int[valArray.length];

dropLast = 0;

}

// validateCardNum method that validates the card number and returns

// boolean value

public boolean validateCardNum()

{

valArray = value.toCharArray();

for (int i = 0; i < valArray.length; i++)

{

valid[i] = (int) valArray[i];

}

for (int i = 0; i < valArray.length; i++)

{

valid[i] = Integer.parseInt(String.valueOf(valArray[valid.length - 1]));

}

dropLast = valid[valid.length - 1];

reverse = reverseArray(valid);

multipleOdd = multiplyAllOdd(reverse);

addDigits = sumDigits(multipleOdd);

int sum = 0;

for (int i = 0; i < addDigits.length; i++)

{

sum = sum + addDigits[i];

}

boolean isValid = isValidSum(sum, dropLast);

return isValid;

}

// reverseArray method that returns a integer array

public int[] reverseArray(int valid[])

{

for (int i = 0; i < valid.length; i++)

{

reverse[i] = valid[valid.length - 1 - i];

}

return reverse;

}

// multiplyAllOdd method that returns a integer array

public int[] multiplyAllOdd(int valid[])

{

for (int i = 0; i < valid.length; i++) { if (i % 2 == 0)

{

multipleOdd[i] = valid[i] * 2;

}

else { multipleOdd[i] = valid[i];

}

}

return multipleOdd;

}

// sumDigits method that returns a integer array

public int[] sumDigits(int valid[])

{

int sum = 0;

for (int i = 0; i < valid.length; i++)

{

sum = 0;

if (valid[i] >= 10) { sum = valid[i] / 10 + valid[i] % 10; addDigits[i] = sum;

}

else

{

addDigits[i] = valid[i];

}

}

return addDigits;

}

// isValidSum method that returns a boolean value

public boolean isValidSum(int sum, int dropLast)

{

if ((sum + dropLast) % 10 == 0)

{

return true;

}

return false;

}

// getCardIssuer method that returns a String value

public String getCardIssuer()

{

if (value.substring(0, 2).equals("34") || value.substring(0, 2).equals("37"))

return "American Express";

else if (value.substring(0, 2).equals("60") || value.substring(0, 2).equals("62") || value.substring(0, 2).equals("64") || value.substring(0, 2).equals("65"))

return "Discover";

else if (value.substring(0, 2).equals("51") || value.substring(0, 2).equals("52") || value.substring(0, 2).equals("53") || value.substring(0, 2).equals("54") || value.substring(0, 2).equals("51"))

return "MasterCard";

else

if (value.substring(0, 1).equals("4")) return "Visa";

else

return "No Issuer";

}

// main method

public static void main(String args[]) throws Exception

{

Scanner in = new Scanner(new File("CreditCardEvaluation.txt"));

PrintWriter pwInvalid = new PrintWriter(new File("invalid_numbers.txt"));

PrintWriter pwValid = new PrintWriter(new File("valid_cards.txt"));

String value;

CreditCard cc;

// loop till end of the file

while (in.hasNextLine())

{

value = in.nextLine();

cc = new CreditCard(value);

// write the valid card numbers into valid text file

if (cc.validateCardNum())

{

pwValid.println(cc.getCardIssuer() + " " + value + " " + value.length());

}
// write the invalid card numbers into invalid text file

else pwInvalid.println(cc.getCardIssuer() + " " + value + " " + value.length());

}

// close all the files

pwInvalid.close();

pwValid.close();

in.close();

}

}

Explanation / Answer

Please try giving full file path like given below:

import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;
public class CreditCard
{
String value;
char valArray[];
int valid[];
int invalid[];
int reverse[];
int multipleOdd[];
int addDigits[];
int dropLast;
// constructor
public CreditCard(String cardNum)
{
if (cardNum.length() >= 13 && cardNum.length() <= 19)
{
value = cardNum;
}
valArray = new char[cardNum.length()];
valid = new int[valArray.length];
reverse = new int[valArray.length];
multipleOdd = new int[valArray.length];
addDigits = new int[valArray.length];
dropLast = 0;
}
// validateCardNum method that validates the card number and returns
// boolean value
public boolean validateCardNum()
{
valArray = value.toCharArray();
for (int i = 0; i < valArray.length; i++)
{
valid[i] = (int) valArray[i];
}
for (int i = 0; i < valArray.length; i++)
{
valid[i] = Integer.parseInt(String.valueOf(valArray[valid.length - 1]));
}
dropLast = valid[valid.length - 1];
reverse = reverseArray(valid);
multipleOdd = multiplyAllOdd(reverse);
addDigits = sumDigits(multipleOdd);
int sum = 0;
for (int i = 0; i < addDigits.length; i++)
{
sum = sum + addDigits[i];
}
boolean isValid = isValidSum(sum, dropLast);
return isValid;
}
// reverseArray method that returns a integer array
public int[] reverseArray(int valid[])
{
for (int i = 0; i < valid.length; i++)
{
reverse[i] = valid[valid.length - 1 - i];
}
return reverse;
}
// multiplyAllOdd method that returns a integer array
public int[] multiplyAllOdd(int valid[])
{
for (int i = 0; i < valid.length; i++) { if (i % 2 == 0)
{
multipleOdd[i] = valid[i] * 2;
}
else { multipleOdd[i] = valid[i];
}
}
return multipleOdd;
}
// sumDigits method that returns a integer array
public int[] sumDigits(int valid[])
{
int sum = 0;
for (int i = 0; i < valid.length; i++)
{
sum = 0;
if (valid[i] >= 10) { sum = valid[i] / 10 + valid[i] % 10; addDigits[i] = sum;
}
else
{
addDigits[i] = valid[i];
}
}
return addDigits;
}
// isValidSum method that returns a boolean value
public boolean isValidSum(int sum, int dropLast)
{
if ((sum + dropLast) % 10 == 0)
{
return true;
}
return false;
}
// getCardIssuer method that returns a String value
public String getCardIssuer()
{
if (value.substring(0, 2).equals("34") || value.substring(0, 2).equals("37"))
return "American Express";
else if (value.substring(0, 2).equals("60") || value.substring(0, 2).equals("62") || value.substring(0, 2).equals("64") || value.substring(0, 2).equals("65"))
return "Discover";
else if (value.substring(0, 2).equals("51") || value.substring(0, 2).equals("52") || value.substring(0, 2).equals("53") || value.substring(0, 2).equals("54") || value.substring(0, 2).equals("51"))
return "MasterCard";
else
if (value.substring(0, 1).equals("4")) return "Visa";
else
return "No Issuer";
}
// main method
public static void main(String args[]) throws Exception
{
Scanner in = new Scanner(new File("C:\Users\Desktop\chegg\CreditCardEvaluation.txt"));
PrintWriter pwInvalid = new PrintWriter(new File("C:\Users\Desktop\chegg\invalid_numbers.txt"));
PrintWriter pwValid = new PrintWriter(new File("C:\Users\Desktop\chegg\valid_cards.txt"));
String value;
CreditCard cc;
// loop till end of the file
while (in.hasNextLine())
{
value = in.nextLine();
//System.out.println(value);
cc = new CreditCard(value);
// write the valid card numbers into valid text file
if (cc.validateCardNum())
{
pwValid.println(cc.getCardIssuer() + " " + value + " " + value.length());
}
// write the invalid card numbers into invalid text file
else pwInvalid.println(cc.getCardIssuer() + " " + value + " " + value.length());
}
// close all the files
pwInvalid.close();
pwValid.close();
in.close();
}
}