如何使用Java一次性检查多个字符串值是否为空或空白

3

我有一个场景需要验证给定的输入参数是否为空,我有一系列带有数据类型字符串日期的字段 - productId,productName,productType,productRating,productSellDate和productReturnDate

我想检查这些输入参数是否nullemptyblank,对于每个字段,如果任何一个字段为emptyblanknull,它应该抛出NullPointerException,并附上字段名称。

请在下面找到我的代码 - 由于我是Java的新手,请原谅我的编码标准。当我抛出NullPointerException时,我不知道如何获取具有emptynull的字段名称。

我正在为每个字符串调用validatevalidateDate,是否有一种选项可以一次性验证所有这些参数?

如果有更好的编写以下代码的方法,请建议。非常感谢您的帮助!谢谢。

import java.util.Date;

public class Test {

    public static void main(String[] args) {
        String productId = "";
        String productName = "Apple";
        String productType = "Electronics";
        String productRating = "Good";
        Date productSellDate = new Date();
        Date productReturnDate = new Date();

        System.out.println(validate(productId));
        System.out.println(validate(productName));
        System.out.println(validate(productType));
        System.out.println(validate(productRating));

        System.out.println(validateDate(productSellDate));
        System.out.println(validateDate(productReturnDate));

    }


    private static String validate(String s) {
        if (s.isBlank() || s.isEmpty()) {
            throw new NullPointerException("input param is empty"); // how to get the string field name which is empty or null or blank
        } else {
            return "valid";
        }
    }


    private static String validateDate(Date d) {
        if (d == null) {
            throw new NullPointerException("sell or return date is empty"); // how to get the date field name which is empty or null or blank
        } else {
            return "date is valid";
        }
    }
}

2
请查看:https://www.baeldung.com/javax-validation - stephane brun
你可以使用org.apache.commons.lang3中的ObjectUtilsObjectUtils.allNotNull(productId, productName, productType, productRating, productSellDate, productReturnDate); - stephane brun
使用javax-validation是可以的,但需要间接指定消息。例如:@NotNull(message = "propertyX为空") - stephane brun
尝试重载方法validate,并添加第二个方法参数,即您要验证的事物的名称,例如validate(String name, String value)validate(String name, Date value) - Abra
@user16320675 对不起,ObjectUtils 不符合您的需求,请参考这个教程 https://www.baeldung.com/javax-validation - stephane brun
1
顺便提一下,我建议您不要使用Date类。该类设计不佳且过时已久。相反,请使用来自java.time,现代Java日期和时间APILocalDate - Ole V.V.
2个回答

2

您可以这样编写代码,以接受任意数量的输入,并在其中任何一个为空或空白时抛出异常。

private static String validate(String... strings) {
    for (String s : strings) {
        if (s == null || s.isBlank() || s.isEmpty()) {
            throw new NullPointerException("input param is empty");
        }
    }
    return "valid";
}

你可以使用任意数量的输入来调用它

validate("1", "2", null, "");

1
谢谢@AmrDeveloper!当我们抛出NullPointerException时,如何获取字段名称? - Dave Brady
欢迎 @DaveBrady,您可以通过将其放在异常消息中来获取其值或索引,但是您无法在运行时获取变量名称。 - AmrDeveloper
1
在调用 String#isBlank后,String#isEmpty是多余和不必要的。 if ( Objects.isNull( s ) || s.isBlank() ) {… - Basil Bourque
你是对的 @BasilBourque,但我只是将他的代码转换为向他展示这个想法。 - AmrDeveloper
1
@BasilBourque 如果响应仍然是抛出 NullPointerException,则无需手动执行:if(s.isBlank()) throw new NullPointerException(); 可以完成整个工作。 - Holger

0

你可能认为这只是对你已有解决方案的微小改进。它肯定不是一次性验证所有变量的方法。我的想法是在同一行中进行验证和赋值。例如:

    String productId = validate("", "productId");
    String productName = validate("Apple", "productName");

结果:

主线程中的异常 "main" java.lang.NullPointerException: productId

该消息提到 productId 为空。

显然,这需要在不抛出异常的情况下,validate() 返回已验证的对象。

private static String validate(String s, String message) {
    if (s == null || s.isBlank()) {
        throw new NullPointerException(message);
    } else {
        return s;
    }
}

我们不需要将isEmpty()作为显式条件,因为isBlank()对于完全空的字符串也返回true。如果您想检查null,则最好自己知道。

对于非字符串变量,只需使用内置的Objects.requireNonNull()

    LocalDate productSellDate = Objects.requireNonNull(
            LocalDate.now(ZoneId.systemDefault()), "productSellDate");
    LocalDate productReturnDate = Objects.requireNonNull(
            LocalDate.now(ZoneId.systemDefault()), "productReturnDate");

LocalDate 是来自 java.time 的一个类,它是现代 Java 日期和时间 API,我建议您在所有日期工作中使用它。 LocalDate 是没有时间的日期。如果您还需要时间,请从同一 API 中找到其他类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接