首頁  >  問答  >  主體

关于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)这样的语句。

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

谢谢

天蓬老师天蓬老师2718 天前294

全部回覆(8)我來回復

  • PHP中文网

    PHP中文网2017-04-17 17:59:57

    而且你的提問有些費解,看不懂你想問什麼問題。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 17:59:57

    首先,你程式碼都寫錯了

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

    應該是if (tem == null)
    其次,即使这样改过来还是不够严谨,tem=""else裡面不就有問題了。
    再次,你這才判斷兩次為null就嫌多啊。
    最後,判斷的次數是根據你的業務邏輯來的,即使在某個地方減少了判斷的次數,在別的地方還是要還的。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:59:57

    你別把null 當方法的回傳值就不用偵測null了,例如你這個例子裡面回傳"0"就可以了。

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:59:57

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 17:59:57

    可以透過業務邏輯嚴密設計來減少非空的判斷,但是依然不能保證維護程式碼產生的畸變,所以為了程式碼的健壯性,還是使用之前先判斷, 如果散落程式碼str == null || "".equals(str) 很不好看,可以使用自己封裝工具或使用開源工具,例如apache的StringUtils 等.

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:59:57

    改了一下你的程式碼:

        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();
        }

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:59:57

    個人做法:

    1. 除非需要null返回,否則別返回null值;別傳遞null值【《Clean Code》也這麼寫】

    2. 如果不返回null,處理方式一:直接拋NPE;處理方式二:用Optional(可以避免我們忘記!=null的校驗,同時比到處!=看著優雅)

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 17:59:57

    這程式碼沒什麼意義啊

    回覆
    0
  • 取消回覆