猿问

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

我有一个验证输入字符串的代码,如果输入字符串不匹配所需的格式,我需要抛出 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);

    }


}

我可以想像下面这样的东西,但它似乎会覆盖以前的错误并且没有多大说服力


UYOU
浏览 168回答 3
3回答

叮当猫咪

您可以做的一件事是将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");}

鸿蒙传说

为什么不使用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);}

慕标5832272

使用你的第二个想法......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
随时随地看视频慕课网APP

相关分类

Java
我要回答