当前位置: 首页 > 知识库问答 >
问题:

Java程序不会抛出所需的异常

荣声
2023-03-14

我正试图用Java开发一个卡片验证程序。isCardValid方法基本上检查给定的卡号是否有效。我在那里指定了一个条件,该条件应该抛出一个IllegalArgumentException,但它没有

以下是我的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");
    }
}

现在,下面的代码片段应该抛出提到的异常,不是吗,因为我故意从我的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

共有1个答案

穆德海
2023-03-14

你的正则表达式错了。

试试这个:

String regex = "\d+";

或者:

String regex = "[0-9]+";

因此无效的数字不匹配;因此没有例外。

为了使用上述模式,必须反转逻辑:

if ( ! input.matches(regex) ) {
  throw exception

但请注意:您的代码“不好”。例如:您没有使用任何类型的抽象。您将信用卡类型表示为字符串。这太糟糕了。因为处理不同信用卡的每一段代码。。。必须知道“AMEX”的意思是“美国运通”,等等。考虑使用EnUM。

换句话说:你真的想阅读/学习如何做好面向对象的设计!

 类似资料:
  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 我的Spring安全配置: 自定义处理程序: 异常解析器: 我的问题是spring security不会抛出任何异常。例如,当我输入一个受保护的url时,它会将我重定向到登录页面。如果我从配置中删除登录页面,它会将我重定向到spring security默认登录表单。因此,我不能处理任何异常,如AccessDeniedException。正如你在上面看到的,我已经定义了自定义的拒绝访问处理程序,它

  • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。

  • 我有一个带有Yarn的Flink集群,使用flink-quickstart-java原型构建一个演示项目。在使用'mvn clean package-pbuild-jar'命令构建fat-jar之后,并使用'flink run-m yar-cluster-yn2./flink-Snapshot-1.0.jar'提交程序,程序会抛出以下异常: 下面是我的演示: 和一些版本信息: FLink版本:1.

  • 我读过这段代码,其中接口抛出异常,但实现它的类没有抛出异常或捕获异常,这是为什么?它在java中是合法的还是安全的?