如何對參數(shù)進(jìn)行校驗

本篇內(nèi)容主要講解“如何對參數(shù)進(jìn)行校驗”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何對參數(shù)進(jìn)行校驗”吧!

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)與策劃設(shè)計,西藏網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:西藏等地區(qū)。西藏做網(wǎng)站價格咨詢:13518219792

背景

大部分的方法和構(gòu)造函數(shù)對傳入的參數(shù)值有一些限制,比如:常見的索引值必須是非負(fù)數(shù),對象引用不能為空。

你應(yīng)該使用清晰的文檔來標(biāo)注所有的這些限制,然后在方法體開始的地方強(qiáng)制他們檢查。

應(yīng)該在錯誤發(fā)生的時候盡快的檢查出來,這是基本原則。

如果你不這么做,當(dāng)錯誤發(fā)生的時候,錯誤將不會被檢測出來,這讓定位錯誤的源頭變得更困難。

如果一個非法參數(shù)傳遞到一個方法中,在方法執(zhí)行前進(jìn)行了參數(shù)檢查。它將會快速失敗,并給出清晰的異常信息。

如果方法沒有檢查參數(shù),下面這些事情會發(fā)生。

如何對參數(shù)進(jìn)行校驗

程度說明

  • 糟糕方法會在執(zhí)行過程中失敗然后拋出一個不明確的異常;

  • 更糟糕方法會正常返回,但是悄悄的計算了一個錯誤的值。

最糟糕方法正常返回,但是一些對象處在一個不正確的狀態(tài),未來一個不確定的時間點在某些無關(guān)聯(lián)的點會造成一個錯誤。

一句話總結(jié):參數(shù)不校驗會導(dǎo)致原子性失敗。

推薦做法

對公共和保護(hù)方法,使用java文檔的@throws標(biāo)簽來標(biāo)注參數(shù)值不合法將拋出的異常。

常見的參數(shù)校驗的異常類型如下:

如何對參數(shù)進(jìn)行校驗

只要你已經(jīng)已經(jīng)在文檔中標(biāo)注了方法參數(shù)的限制和違反限制會拋出的異常,限制將是一個簡單的事情,下面是一個典型的例子。

/** *@param m 必須是正整數(shù) *@throws ArithmeticException 如果m<=0 **/ public BigInteger mod(BigInteger m){     if(m<=0){         throw new ArithmeticException("modulus <=0: "+ m);     }    //todo 其它代碼 }

注意:

  • 文檔注釋并沒有說, 如果m是空,mod將拋出NullPointException,  盡管這個方法確實會這樣。調(diào)用m.signum()的時候這個異常被標(biāo)注在類級別BigInteger的文檔注釋上,類級別的注釋適用于所有的公共方法的參數(shù),這是一個避免在每個方法單獨的文檔化標(biāo)注NullPointException這種混亂的好方法。

也許可以結(jié)合@Nullable或者類似的注解來指明特殊參數(shù)可以為空,但是這個實踐并不是標(biāo)準(zhǔn)的,并且有很多注解可以用來達(dá)到這個目的。

Objects實用類

Objects.requireNonNull方法,在Java7中添加的,非常的靈活和方便,所以沒有理由手動的執(zhí)行空指針檢查。  你也可以指定異常的詳細(xì)信息,這個方法返回自己的輸入,所以你可以在使用該值的時候執(zhí)行一個空指針檢查。

//一行代碼使用java的空指針檢查 this.strategy = Objects.requireNonNull(strategy,"strategy")

如果你可以忽略返回值,你也可以根據(jù)你的需要使用Objects.requireNonNull作為獨立的空指針檢查。在Java9中,一個范圍檢查的方法被添加到了java.util.Objects中,包含了3個方法:

如何對參數(shù)進(jìn)行校驗

這3個方法沒有空指針檢查方法靈活,它無法讓你指定自己的異常詳細(xì)信息,它被設(shè)計用在List和Array的索引檢查上。  它也無法處理閉區(qū)間,但是只要你需要,這就是一個小便利。

Java斷言

對一個不開放的方法,你作為包的作者,控制著方法的調(diào)用狀況,你必須保證只有合法的參數(shù)值傳遞進(jìn)去了。所以,對非公開的方法,你可以使用斷言來進(jìn)行參數(shù)檢查,如下所示:

//私有幫助排序函數(shù) private static void sort(long a[] , int offset, int length){     assert a != null ;    //更多代碼 }

本質(zhì)上來講,斷言申明條件一定是true ,  忽略客戶端如何使用對應(yīng)的包。跟一般的合法性檢查不同,斷言失敗的時候拋出AssertError;跟一般的合法性檢查不同,除非你啟用他們否則斷言對你沒有任何影響和消耗。在java命令行啟用指令:

-ea 或者 -enableassertions

更多斷言的信息,查看java手冊的Asserts;

檢查參數(shù)的合法性非常重要,即使你的方法中沒有用到,但是存儲起來了,后面會用到。

舉個例子: 靜態(tài)工廠方法: 輸入一個 int數(shù)組 ,返回一個array的 list視圖, 如果客戶端傳入 null, 這個方法會拋出NPE,  因為方法會有一個直接檢查,調(diào)用了Objects.requireNonNull。如果忽略檢查,方法會返回一個引用新創(chuàng)建的List的實例;

而客戶端嘗試使用的時候回拋出NPE; 這個時候,原始的List實例很難決定,很大可能會復(fù)雜到變成一個調(diào)試任務(wù)。

構(gòu)造函數(shù)代表了一個特殊例子的原則: 你應(yīng)該檢查即將存儲稍后會用到的參數(shù)的合法性。

檢查構(gòu)造函數(shù)參數(shù)的合法性非常重要,它可以防止構(gòu)造一個違反類的不變性的對象。

異常情況

在執(zhí)行方法計算之前,你應(yīng)該檢查方法參數(shù) 。 這個規(guī)則也有異常情況。

一個重要的異常情況是:合法性檢查代價非常高并且重要, 并且檢查是在執(zhí)行計算的過程中執(zhí)行的。舉個例子:有一個方法對一個對象list排序,比如  Collectios.sort(list),所有的list中的對象必須是可互相比較的。在處理list比較的時候,每個對象將會跟其它的對象進(jìn)行比較,

如果對象不能互相比較,其中一個或多個比較會拋出ClassCastException,這是排序方法應(yīng)該做的。

所以:這里有一個小店,在開始的時候檢查列表中的元素應(yīng)該是可以互相比較的,注意:修改合法性檢查會喪失原子失敗。

偶爾,一個計算執(zhí)行了一個需要的合法性檢查,但是當(dāng)執(zhí)行檢查失敗的時候,拋出了一個錯誤的異常。換句話說,計算常常會拋出參數(shù)合法性檢查的異常,并不會匹配方法在文檔中申明的異常。這種場景下,你應(yīng)該使用異常翻譯成語。  轉(zhuǎn)換自然異常為正確的異常。

這個原則并不是說武斷的限制參數(shù)是一件好事,而是說:你應(yīng)該設(shè)計通用實際的方法。假設(shè)你的方法接受所有的參數(shù)組合而可以做一些合理事情,你的參數(shù)限制越少越好,然而,一些限制本質(zhì)上在抽象類中已經(jīng)被實現(xiàn)了。

到此,相信大家對“如何對參數(shù)進(jìn)行校驗”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前題目:如何對參數(shù)進(jìn)行校驗
轉(zhuǎn)載注明:http://bm7419.com/article8/jdisop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站、建站公司、微信公眾號、網(wǎng)站策劃網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管