keep getting this error Exception in thread main javalangNul
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() + \"\\t\" + value + \"\\t\" + value.length());
}
// write the invalid card numbers into invalid text file
else pwInvalid.println(cc.getCardIssuer() + \"\\t\" + value + \"\\t\" + value.length());
}
// close all the files
pwInvalid.close();
pwValid.close();
in.close();
}
}
Solution
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()) {
// changed the here to read next number instead of getting line
value = in.next();
cc = new CreditCard(value);
// write the valid card numbers into valid text file
if (cc.validateCardNum()) {
pwValid.println(cc.getCardIssuer() + \"\\t\" + value + \"\\t\"
+ value.length());
}
// write the invalid card numbers into invalid text file
else
pwInvalid.println(cc.getCardIssuer() + \"\\t\" + value + \"\\t\"
+ value.length());
}
// close all the files
pwInvalid.close();
pwValid.close();
in.close();
}
}
CreditCardEvaluation.txt
3158539628375348 3337465828248404 3112804683572030 3112804683572033 5435528978467581 6706465468107999 6304362971054667 6706169762827894 6706169762827892 4844104341377697 4913405490886727 4844885754351829 4844885754351822 6371473570875275 6381475006869978 6389057917814806 347100734345549 347100734345543 6011162533805000 6011621663574413 6011824617460743 6011824617460745 6389057917814802 4539318768050385 36880982786892 36845793345501 36661154562232 36661154562234 5893329089846994 6761680165952016 6763100400984029 6763100400984022 5127043299122389 5330838017737340 5429168755154025 5429168755154023 375354034606481 379570632133224 4485521241443135 4532916206508075 4532916206508076 5590976687287124 5540641137519895 5540641137519892 30522070708059 30066552673241 30365487186802 30365487186801
invalid_numbers.txt
No Issuer 3158539628375348 16
No Issuer 3112804683572033 16
MasterCard 5435528978467581 16
No Issuer 6706465468107999 16
No Issuer 6304362971054667 16
Visa 4844104341377697 16
Visa 4913405490886727 16
Visa 4844885754351829 16
No Issuer 6371473570875275 16
No Issuer 6381475006869978 16
No Issuer 6389057917814806 16
American Express 347100734345549 15
American Express 347100734345543 15
Discover 6011621663574413 16
Discover 6011824617460743 16
Discover 6011824617460745 16
Visa 4539318768050385 16
No Issuer 36880982786892 14
No Issuer 36845793345501 14
No Issuer 36661154562232 14
No Issuer 36661154562234 14
No Issuer 6761680165952016 16
No Issuer 6763100400984029 16
MasterCard 5127043299122389 16
MasterCard 5429168755154025 16
MasterCard 5429168755154023 16
American Express 375354034606481 15
American Express 379570632133224 15
Visa 4485521241443135 16
Visa 4532916206508075 16
Visa 4532916206508076 16
No Issuer 5540641137519895 16
No Issuer 30522070708059 14
No Issuer 30066552673241 14
No Issuer 30365487186802 14
No Issuer 30365487186801 14
valid_cards.txt
No Issuer 3337465828248404 16
No Issuer 3112804683572030 16
No Issuer 6706169762827894 16
No Issuer 6706169762827892 16
Visa 4844885754351822 16
Discover 6011162533805000 16
No Issuer 6389057917814802 16
No Issuer 5893329089846994 16
No Issuer 6763100400984022 16
MasterCard 5330838017737340 16
No Issuer 5590976687287124 16
No Issuer 5540641137519892 16
NOTE: I changed the code next() instead of nextLine() in main method








