首页 > 解决方案 > 如何快速找到多个字符串中为空或为空的字符串

问题描述

我有几个字符串,如 id、name、age 等,我想检查以确保它们不为空或 null,如果为空或 null,则抛出异常并显示错误消息,例如:“id can not为空或 null"

这就是我现在正在做的事情,但是如果第一个 if 条件正确,我需要一个一个地检查它们,有没有办法让代码变得简单和容易?

if((StringUtils.isNotEmpty(id) && StringUtils.isNotEmpty(name) && StringUtils.isNotEmpty(age)) == false) {
   if(StringUtils.isNotEmpty(id) == false) {
     throw Exception("...")
   }
   else if(StringUtils.isNotEmpty(name) == false) {
     throw Exception("...")
   }
   ..
}

标签: java

解决方案


这些双重否定确实会对代码的可读性产生负面影响。例如if(StringUtils.isNotEmpty(id) == false),可以轻松替换为id.isEmpty(). 应用这将转化为:

public void verify() throws IllegalStateException {
    if(name == null || id == null)
        throw new IllegalStateException("not initialized");
    if(name.isEmpty())
        throw new IllegalStateException("name is empty");
    if(id.isEmpty())
        throw new IllegalStateException("id is empty");
}

如果任何字符串为空,另一种方法是仅抛出错误:

public void verify() throws IllegalStateException {
    if(isEmpty())
        throw new IllegalStateException("object was empty: " + toString());
}

private boolean isEmpty() {
    return id.isEmpty() || name.isEmpty();
}

@Override
public String toString() {
    StringBuilder str = new StringBuilder("Person{");
    str.append("id: " + id + " ");
    str.append("name: " + name + " ");
    str.append("}");
    return str.toString();
}

现在,如果抛出错误,您可以检查哪个变量负责它(如果您愿意)。

也就是说,最好的解决方案是重新设计您的对象结构。使用您自己的书面课程时,测试null不应该是一件事情。少数理由之一是在使用低级 API 时,但在相应的函数调用之外永远不应该看到所有 null 的东西。你的函数不应该返回 null ,反过来,期望 null 作为参数或使用 null 作为检查某些东西的值。Null 表示程序员错误(例如,函数调用不正确),即程序中的缺陷。因此, NullPointerException 将作为未经检查的异常抛出。所以在大多数情况下,当 null 作为参数给出时,不要处理这种情况。

要考虑的另一件事是,当您使用 setter 时,这种验证方法可能是多余的。始终保持您的成员变量处于有效状态。例如,没有年龄和身份(应该自动给出),一个真实的人就无法存在。因此,如果您真的想检查输入是否为空并抛出错误,我建议:

class Person {

    private String id, name, age;

    public Person(String name, String age) {

        if(name.isEmpty() || age.isEmpty())
            throw new IllegalStateException("name and age cannot be empty!");

        this.id = UUID.randomUUID().toString();
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        if(name.isEmpty())
            throw new IllegalStateException("name cannot be empty!");
        else
            this.name = name;
    }

    public void setAge(String age) {
        if(age.isEmpty())
            throw new IllegalStateException("age cannot be empty!");
        else
            this.age = age;
    }
}

这是基于“id、name、age”是类的成员变量的想法。


推荐阅读