当前位置: 首页 > 知识库问答 >
问题:

避免空检查?

甄永年
2023-03-14

我想知道是否有可能在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中是否可以直接在方法中使用方法(虚空)?

那么这样的代码真的可以工作吗?

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

我知道我可以将方法放在它自己的类中,这个类扩展了一个具有execute()方法的接口,然后传递这个类,但是这样做会使消除空检查或任何更复杂的东西的目的落空。

问候。

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

共有2个答案

严远
2023-03-14

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

你怎么能这样假设?通过让AccountConstraint的规范这么说。然后,AccountConstraint中的代码负责确保值不为空,而不是您的Search方法负责处理空值。为此,您可能必须更改AccountConstraint的设计。

如果你的假设是错误的会发生什么?也就是说,如果AccountConstraint有缺陷。将引发异常,这是您没有预料到的。但这就是当您有bug时可能发生的情况:抛出一个意外的异常。调试代码将很容易,因为stacktrace将向您显示AccountConstraint的哪个方法返回无效的null值。

越涵衍
2023-03-14

是和不是。

有两种方法可以解决空问题:

特殊的操作符,如Groovy中的安全导航操作符。如果x.y抛出NullPointerExceptionx?.y仅返回Null。由于Java不允许创建新的运营商,所以在Java你不能这样做。像这样的操作符,在JDK8中考虑过,但在JDK8中放弃了。如果您想拥有这样的功能,请切换到Groovy或其他具有此功能的语言中的一种。

特殊类许多语言都有一个特殊的接口来表示一个值,该值可能是null。在Scala中,它被称为选项。选项有两种实现:none+some。无替换null。每当您想对该值做一些事情时,您都不直接使用它,而是对具有函数作为参数的选项调用map。如果它实际上是一个“无”,什么也不会发生,你只会得到一个“无”。如果它是一个Some,则在该值上执行函数,并得到一个带有结果的选项。这样,您就可以一直使用选项,而不必担心nulls。

实际上,它是一种特殊的方式,所以你可以创建这样一个类自己与Java。问题只是,Java没有功能,所以你必须使用匿名类。这使得整件事真的很繁琐,只是一个理论上的选项。

JDK8有一个option类。据我所知,它缺少map方法,在我看来,这使得整个事情成了一个糟糕的笑话。但既然最重要的工具(匿名函数)存在,那么通常的疑犯之一(Google、Apache……)就会提供一个适当的选项实现

 类似资料:
  • 我有如下所示的JSON 我将文件读成字符串并创建一个JSONObject,如下所示 然而,我认为我可以用try catch将语句括起来 请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。 您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

  • 在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF

  • 想象一下我有一个阶级家庭。它包含一个人员列表。每个(班级)人都有一个(班级)地址。每个(类)地址都包含一个(类)邮政编码。任何“中间”类都可以为空。 那么,有没有一种简单的方法可以在不必在每一步都检查null的情况下访问PostalCode?i、 例如,有没有办法避免以下菊花链代码?我知道没有“原生”Java解决方案,但我希望如果有人知道某个库或其他东西。(已选中Commons 不,不能改变结构。

  • 有没有可能编写这样的内容,并且避免检查元素是否为空,集合是否为空: 我找到了这样的东西http://winterbe.com/posts/2015/03/15/avid-null-check-in-/ 基本上,我想要实现的是避免层次结构中如果带有多个检查天气对象的语句为null或集合为空。我在上面的文章中读到,这是可能的,可选的“空检查在引擎盖下自动处理。” 如果已经有了一些解决方案,很抱歉复制,

  • 问题内容: 我需要检查某个值是否为null。如果它不为null,则将一些变量设置为true。这里没有其他声明。这样的条件检查太多了。 有什么方法可以在不检查所有方法返回值的情况下处理此空检查? 我认为直接检查变量并忽略NullpointerException。这是一个好习惯吗? 问题答案: 不,在Java中捕获NPE而不是对您的引用进行空检查通常不是一个好习惯。 如果您愿意,可以使用这种东西: 或

  • 将编译为以下内容而不使用装箱: 因此,编译器确实特别对待,但不是在泛型类上下文中。