Java 程序不会抛出所需的异常
Java program won't throw the desired exception
我正在尝试在 Java 中开发卡验证程序。 isCardValid
方法基本上检查给定的卡号是否有效。我在那里指定了一个应该抛出 IllegalArgumentException
的条件,但它没有并且程序成功执行 exit code 0
以下是我的 Java 文件:-
public class CardValidation {
public static String getCardBrand(final String cardIsin){
String brand = null;
if (cardIsin == null || cardIsin.equals("")){
log.warn("Given card BIN is null!! So returning null");
return brand;
}
if (cardIsin.substring(0,2).matches("51|52|53|54|55"))
brand = "MasterCard".toUpperCase();
else if (cardIsin.startsWith("4"))
brand = "Visa".toUpperCase();
else if (cardIsin.startsWith("34") || cardIsin.startsWith("37"))
brand = "Amex".toUpperCase();
else if (Pattern.matches(maestroPattern,cardIsin))
brand = "Maestro".toUpperCase();
else if (Pattern.matches(diners, cardIsin))
brand = "Diners".toUpperCase();
else if (Pattern.matches(discover,cardIsin))
brand = "Discover".toUpperCase();
else if (doesFallInRupayRange(cardIsin))
brand = "Rupay".toUpperCase();
else if (cardIsin.startsWith("35"))
brand = "JCB";
return brand;
}
public static boolean isCardValid(final String cardNumber){
if(cardNumber.matches("[^0-9]"))
throw new IllegalArgumentException("INVALID ARGUMENT!!!! Card number should contain ONLY digits.");
String cardBrand = getCardBrand(cardNumber);
if (cardBrand == null)
return false;
if(cardBrand.equalsIgnoreCase("VISA") || cardBrand.equalsIgnoreCase("MasterCard") ||
cardBrand.equalsIgnoreCase("DISCOVER") || cardBrand.equalsIgnoreCase("RUPAY")) {
return cardNumber.length() == 16;
}
else if(cardBrand.equalsIgnoreCase("AMEX")) {
return cardNumber.length() == 15;
}
else if(cardBrand.equalsIgnoreCase("MAESTRO")) {
return cardNumber.length() == 16 || cardNumber.length() == 19;
}
else if(cardBrand.equalsIgnoreCase("DINERS")) {
return cardNumber.length() == 14;
}
log.info("Unknown card number brand: " + cardNumber);
return cardNumber.length() >= 12;
}
public static boolean doesFallInRupayRange(final String isin){
long intIsin = Long.parseLong(isin.replaceAll("[^\d]", "").substring(0,6));
for (int row = 0; row < CardValidation.rupayRange.length; row++)
{
try {
if (intIsin >= CardValidation.rupayRange[row][0] && intIsin <= CardValidation.rupayRange[row][1])
return true;
}
catch (Exception e) {
log.error("Error while checking for RuPay: " + isin, e);
}
}
return false;
}
public static void main (String... args){
CardValidation.isCardValid("42424242hghghghgh");
}
}
现在下面的代码片段应该抛出提到的 Exception
,不是吗,因为我故意向我的 main 中的方法提供无效参数?
if(cardNumber.matches("[^0-9]"))
throw new IllegalArgumentException("INVALID ARGUMENT!!!! Card number should contain ONLY digits.");
以下是我在控制台中得到的输出
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Process finished with exit code 0
您的正则表达式错误。
试试这个:
String regex = "\d+";
或者:
String regex = "[0-9]+";
因此不匹配无效号码;因此也不例外。
为了使用上面的模式,你必须反转逻辑:
if ( ! input.matches(regex) ) {
throw exception
但请注意:您的代码是 "not good"。例如:您没有使用任何类型的 抽象 。您将信用卡类型表示为 Strings。这就像超级糟糕。因为处理不同信用卡的每一段代码...都必须知道 "AMEX" 表示“美国运通;等等。考虑改用 Enum。
换句话说:你真的想read/learn做好面向对象的设计!
我正在尝试在 Java 中开发卡验证程序。 isCardValid
方法基本上检查给定的卡号是否有效。我在那里指定了一个应该抛出 IllegalArgumentException
的条件,但它没有并且程序成功执行 exit code 0
以下是我的 Java 文件:-
public class CardValidation {
public static String getCardBrand(final String cardIsin){
String brand = null;
if (cardIsin == null || cardIsin.equals("")){
log.warn("Given card BIN is null!! So returning null");
return brand;
}
if (cardIsin.substring(0,2).matches("51|52|53|54|55"))
brand = "MasterCard".toUpperCase();
else if (cardIsin.startsWith("4"))
brand = "Visa".toUpperCase();
else if (cardIsin.startsWith("34") || cardIsin.startsWith("37"))
brand = "Amex".toUpperCase();
else if (Pattern.matches(maestroPattern,cardIsin))
brand = "Maestro".toUpperCase();
else if (Pattern.matches(diners, cardIsin))
brand = "Diners".toUpperCase();
else if (Pattern.matches(discover,cardIsin))
brand = "Discover".toUpperCase();
else if (doesFallInRupayRange(cardIsin))
brand = "Rupay".toUpperCase();
else if (cardIsin.startsWith("35"))
brand = "JCB";
return brand;
}
public static boolean isCardValid(final String cardNumber){
if(cardNumber.matches("[^0-9]"))
throw new IllegalArgumentException("INVALID ARGUMENT!!!! Card number should contain ONLY digits.");
String cardBrand = getCardBrand(cardNumber);
if (cardBrand == null)
return false;
if(cardBrand.equalsIgnoreCase("VISA") || cardBrand.equalsIgnoreCase("MasterCard") ||
cardBrand.equalsIgnoreCase("DISCOVER") || cardBrand.equalsIgnoreCase("RUPAY")) {
return cardNumber.length() == 16;
}
else if(cardBrand.equalsIgnoreCase("AMEX")) {
return cardNumber.length() == 15;
}
else if(cardBrand.equalsIgnoreCase("MAESTRO")) {
return cardNumber.length() == 16 || cardNumber.length() == 19;
}
else if(cardBrand.equalsIgnoreCase("DINERS")) {
return cardNumber.length() == 14;
}
log.info("Unknown card number brand: " + cardNumber);
return cardNumber.length() >= 12;
}
public static boolean doesFallInRupayRange(final String isin){
long intIsin = Long.parseLong(isin.replaceAll("[^\d]", "").substring(0,6));
for (int row = 0; row < CardValidation.rupayRange.length; row++)
{
try {
if (intIsin >= CardValidation.rupayRange[row][0] && intIsin <= CardValidation.rupayRange[row][1])
return true;
}
catch (Exception e) {
log.error("Error while checking for RuPay: " + isin, e);
}
}
return false;
}
public static void main (String... args){
CardValidation.isCardValid("42424242hghghghgh");
}
}
现在下面的代码片段应该抛出提到的 Exception
,不是吗,因为我故意向我的 main 中的方法提供无效参数?
if(cardNumber.matches("[^0-9]"))
throw new IllegalArgumentException("INVALID ARGUMENT!!!! Card number should contain ONLY digits.");
以下是我在控制台中得到的输出
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Process finished with exit code 0
您的正则表达式错误。
试试这个:
String regex = "\d+";
或者:
String regex = "[0-9]+";
因此不匹配无效号码;因此也不例外。
为了使用上面的模式,你必须反转逻辑:
if ( ! input.matches(regex) ) {
throw exception
但请注意:您的代码是 "not good"。例如:您没有使用任何类型的 抽象 。您将信用卡类型表示为 Strings。这就像超级糟糕。因为处理不同信用卡的每一段代码...都必须知道 "AMEX" 表示“美国运通;等等。考虑改用 Enum。
换句话说:你真的想read/learn做好面向对象的设计!