我想知道是否可以在 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/