为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免使用多个 throw 语句并仅使用一个带有所需错误消息的通用 throw 语句

如何避免使用多个 throw 语句并仅使用一个带有所需错误消息的通用 throw 语句

UYOU 2022-10-20 17:23:19
我有一个验证输入字符串的代码,如果输入字符串不匹配所需的格式,我需要抛出 IllegalArgumentException,有多个字段,每个字段都有一组不同的验证条件,所以对于每个字段,我目前正在执行“如果”检查如果不满意我抛出 IllegalArgumentException 并且对应字段有多个 if 条件,并且每个 IllegalArgumentException 都有不同的消息要打印关于字段。我正在寻找更通用的方法/重构,我可以只抛出一次 IllegalArgumentException 并为无效条件提供所需的错误消息。我可以想到一种情况,我可以创建变量 say errorMeaage 并在其中存储错误消息,最后,如果变量 errorMeaage 不为空,我可以抛出 IllegalArgumentException 和所需的消息,但这并不能说服我。当前代码:package Miscellanious;public class ValidationMain {    public static void main(String args[]) {        ValidationMain obj = new ValidationMain();        obj.validate("Sam", "Rock", "Turner");    }    public void validate(String firstName, String middleName, String lastName) {        if (firstName != null && !firstName.matches("^[a-zA-Z`’ -]{1,50}$")) {            throw new IllegalArgumentException("Invalid value for firstName field from Input Parameter");        }        if (middleName != null && !middleName.matches("^[a-zA-Z.`’ -]{0,50}$")) {            throw new IllegalArgumentException("Invalid value for middleName field from Input Parameter");        }        if (lastName != null && !lastName.matches("^[a-zA-Z`’ -]{2,50}$")) {            throw new IllegalArgumentException("Invalid value for lastName field from Input Parameter");        }        System.out.println(firstName + " " + middleName + " " + lastName);    }}我可以想像下面这样的东西,但它似乎会覆盖以前的错误并且没有多大说服力
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以做的一件事是将if检查提取到一个单独的方法中,您可以使用输入、正则表达式和消息调用该方法:


private void validateInput(String input, String regex, String message) {

    if (input != null && !input.matches(regex)) {

        throw new IllegalArgumentException("Error Message :" + message);

    }

}


public void validate(String firstName, String middleName, String lastName) {

    this.validateInput(firstName, "^[a-zA-Z`’ -]{1,50}$", 

                       "Invalid value for firstName field from Input Parameter");

    this.validateInput(middleName, "^[a-zA-Z.`’ -]{0,50}$", 

                       "Invalid value for middleName field from Input Parameter");

    this.validateInput(lastName, "^[a-zA-Z`’ -]{2,50}$", 

                       "Invalid value for lastName field from Input Parameter");

}


查看完整回答
反对 回复 2022-10-20
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

为什么不使用else if来防止消息被覆盖?这样代码将在第一个匹配的条件下退出。这是假设您想坚持您的实现而不是过多地编辑代码。


public void validate(String firstName, String middleName, String lastName) {


    String errorMessage = null ;


    if (firstName != null && !firstName.matches("^[a-zA-Z`’ -]{1,50}$")) {

        errorMessage = "Invalid value for firstName field from Input Parameter";

    }else if (middleName != null && !middleName.matches("^[a-zA-Z.`’ -]{0,50}$")) {

        errorMessage = "Invalid value for middleName field from Input Parameter";

    }else if (lastName != null && !lastName.matches("^[a-zA-Z`’ -]{2,50}$")) {

        errorMessage = "Invalid value for lastName field from Input Parameter";

    }


    if (errorMessage != null){


        throw new IllegalArgumentException("Error Message :" + errorMessage);

    }


    System.out.println(firstName + " " + middleName + " " + lastName);

}


查看完整回答
反对 回复 2022-10-20
?
慕标5832272

TA贡献1966条经验 获得超4个赞

使用你的第二个想法......


public void validate(String firstName, String middleName, String lastName) {

        String errorMessage = "Invalid value for fields %s from Input Parameter";

        StringBuffer fields = new StringBuffer();


        if (firstName != null && !firstName.matches("^[a-zA-Z`’ -]{1,50}$")) {

            fields.append("firstName");

        }



        if (middleName != null && !middleName.matches("^[a-zA-Z.`’ -]{0,50}$")) {

            fields.append(" middleName");

        }


        if (lastName != null && !lastName.matches("^[a-zA-Z`’ -]{2,50}$")) {

            fields.append(" lastName");

        }


        if (fields.length() > 0){

            throw new IllegalArgumentException("Error Message :" + String.format(errorMessage, fields.toString()));

        }


        System.out.println(firstName + " " + middleName + " " + lastName);

    }

打电话给


validate("", "1", "");

输出:


Exception in thread "main" java.lang.IllegalArgumentException: Error Message :Invalid value for fields firstName middleName lastName from Input Parameter

    at Main.validate(Main.java:26)

    at Main.main(Main.java:5)

exit status 1

打电话给


validate("Andres", "1", "Martinez");

输出:


Exception in thread "main" java.lang.IllegalArgumentException: Error Message :Invalid value for fields  middleName from Input Parameter

    at Main.validate(Main.java:26)

    at Main.main(Main.java:5)

exit status 1


查看完整回答
反对 回复 2022-10-20
  • 3 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号