首页 > 关于java方法里的非空判断的疑问,谢谢

关于java方法里的非空判断的疑问,谢谢

    public static void main(String[] args) {
        String result = replaceStr("jaja");
        if (result != null) {            //在这里又要判断下非空
              int count = 50 + Integer.parseInt(result);
        }
    }
    
    public static String replaceStr(String tem){
        String result;
        if (tem == null) {
            result = null;
        } else {
            String substring = tem.substring(0, 1);
            result = substring;
        }
        return result;
    }

如上代码,我的疑惑时,当参数tem为空,方法返回null,那岂不是又要在调用replaceStr这个方法的地方又要判断次返回值是否为null?那这个代码看上去不是很难看,好多if(**!=null)这样的语句。

我想问的是:有没有一种设计,可以只要在一处判断非空,其他地方只要写业务逻辑就行了?

谢谢


你别把null 作为方法的返回值就不用检测null了,比如你这个例子里面返回"0"就可以了。


改了一下你的代码:

    public static String replaceStr(String tem){
        if (tem == null || tem.length() == 0) {
            return null;
        }
        return tem.substring(0, 1);
    }

首先,判断非空这种业务需求是无法避免的,或者你可以在设计的时候加上默认值,当返回值为null时就使用默认值(具体还要视乎业务上遇到null值时下一步要怎么处理,或使用默认值,或抛出异常,或终止执行,etc)。

关于默认值的使用可以看一下guava的MoreObjects#firstNonNull。

java8中的Optional就是为了解决这种判空的问题(其实还是免不了判断,只是换了种方式避免NullPointerException),也可以看一下。

另外,直接ctrl+c spring的StringUtils#replace方法给你(同理也可以参考apache common的StringUtils,反正java的世界就不缺StringUtils),可以参考一下别人是怎样实现的。

/**
     * Replace all occurrences of a substring within a string with
     * another string.
     * @param inString {@code String} to examine
     * @param oldPattern {@code String} to replace
     * @param newPattern {@code String} to insert
     * @return a {@code String} with the replacements
     */
    public static String replace(String inString, String oldPattern, String newPattern) {
        if (!hasLength(inString) || !hasLength(oldPattern) || newPattern == null) {
            return inString;
        }
        StringBuilder sb = new StringBuilder();
        int pos = 0; // our position in the old string
        int index = inString.indexOf(oldPattern);
        // the index of an occurrence we've found, or -1
        int patLen = oldPattern.length();
        while (index >= 0) {
            sb.append(inString.substring(pos, index));
            sb.append(newPattern);
            pos = index + patLen;
            index = inString.indexOf(oldPattern, pos);
        }
        sb.append(inString.substring(pos));
        // remember to append any characters to the right of a match
        return sb.toString();
    }

这代码没什么意义啊


如果确定你的term入参在正常业务场景下必须不能为null,那么没必要去做null值得判断,尽早抛出空指针异常是合理的。


可以通过业务逻辑严密设计来减少 非空的判断,但是依然不能保证维护代码产生的畸变,所以为了代码的健壮性,还是使用之前首先判断, 如果散落代码 str == null || "".equals(str) 很不好看,可以使用自己封装工具或使用开源工具,比如apache的StringUtils 等.


而且你的提问有些费解,看不懂你想问什么问题。


个人做法:

  1. 除非需要null返回,否则别返回null值;别传递null值【《Clean Code》也这么写】

  2. 如果不返回null,处理方式一:直接抛NPE;处理方式二:用Optional(可以避免我们忘记!=null的校验,同时比到处!=看着优雅)


首先,你代码都写错了

        if (tem != null) {
            result = null;
        } else {
            String substring = tem.substring(0, 1);
            result = substring;
        }  

应该是if (tem == null)
其次,即使这样改过来还是不够严谨,tem=""else里面不就有问题了。
再次,你这才判断两次为null就嫌多啊。
最后,判断的次数是根据你的业务逻辑来的,即使在某个地方减少了判断的次数,在别的地方还是要还的。

【热门文章】
【热门文章】