java - 避免空检查?

标签 java nullpointerexception

我想知道是否可以在 Java 中“避免”空值检查,以这段代码为例:

@Override
public List<AccountBean> search(AccountConstraint... c) {
    if (c.length == 0) {
        throw new IllegalArgumentException("dao.AccountDAO.search: c.length == 0");
    }
    try {
        List<AccountBean> beans = new ArrayList<>();
        for (AccountConstraint ac : c) {
            Builder builder = new QueryBuilder.Builder("SELECT * FROM accounts");
            if (ac.getAccountId() != null) {
                builder.clause("accountId >= " + ac.getAccountId().getMin() + " AND accountId <= " + ac.getAccountId().getMax());
            }
            if (ac.getUsername() != null) {
                builder.clause("username = \"" + ac.getUsername() + "\"");
            }
            if (ac.getPassword() != null) {
                builder.clause("password = \"" + ac.getPassword() + "\"");
            }
            if (ac.getEmail() != null) {
                builder.clause("email = \"" + ac.getEmail() + "\"");
            }
            PreparedStatement ps = connection.prepareStatement(builder.build().getQuery());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                beans.add(new AccountBean(rs));
            }
        }
        return beans;
    } catch (SQLException ex) {
        throw new RuntimeException(ex);
    }
}

它必须检查 4 次 != null因为否则代码会失败。

是否可以将 if (object != null)如果没有 NullPointerException,执行单行语句?当出现异常时,该行应该被忽略。

我在这里不是在谈论一般语言功能,而是在谈论只有在您明确决定这样做时才会启用的功能。

例如:NullCheck(builder.clause("username = \"" + ac.getUsername() + "\""));将是建议代码的片段。

在 Java 中可以实现类似的功能吗?

另外,如果不可能,Java 8 中是否可以直接在方法中使用方法(void)?

那么这样的代码实际上可以工作吗?

public static NullCheck(Void void) {
    try {
        void.execute();
    }
    catch (NullPointerException e) {
        //ignore
    }
}

我知道我可以将方法放在它自己的类中,该类扩展了一个具有方法 execute() 的接口(interface)然后传递那个类,但这会破坏摆脱空检查或任何更复杂的东西的目的。

问候。

警告:我在这里使用 PreparedStatement 的方式很容易发生 SQL 注入(inject)。不要重复使用此代码。

最佳答案

您可以通过假设这些方法不返回空值来避免这些检查。

你怎么能假设这个?通过让 AccountConstraint 的规范如此说明。 AccountConstraint 中的代码负责确保值不为空,而不是您的 search 方法负责处理空值。您可能必须更改 AccountConstraint 的设计才能执行此操作。

如果你的假设是错误的,会发生什么?也就是说,如果 AccountConstraint 有问题。将抛出异常,这是您没有预料到的。但这就是当你有一个错误时会发生的事情:抛出一个意外的异常。调试代码会很容易,因为堆栈跟踪将向您显示 AccountConstraint 的哪个方法返回了无效的空值。

关于java - 避免空检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17373820/

相关文章:

javascript - 从请求到响应的 Karate dsl 断言

java - hibernate/JPA : storing constants in entity class?

java - 无锁数组元素交换

java - 尝试从异步类 android 中的 url 解析 JSON 数据时出现空指针异常

java - 什么是 NullPointerException,我该如何解决?

java - 在 MouseClicked 中使用 for-each 循环来 getX 和 getY 每个对象

c# - 在 C# 中构建字符串数组并检查空值?

Java匿名类和可达的私有(private)变量

java - SMB jcifs "jcifs.smb.client.dfs.disabled=true"影响

java - 删除 ListVIew 中的多行