Java函數中的參數有效性檢查

來源:互聯網
上載者:User


本作品採用知識共用署名-非商業性使用-相同方式共用 2.5 中國大陸許可協議 進行許可。

 

在Java程式中,方法與屬性是類中最基本的成員。下面的問題與方法有關:

實現一個方法的第一步是什嗎?

說到這裡我突然想起侯耀文、趙麗蓉兩位藝術家在小品《英雄母親的一天》中有這樣一段台詞:

導演:您起床後做的第一件事是什嗎?可以隨便說。
大娘一聽可以隨便說,笑了。
大娘(湊到導演的耳朵邊,輕聲地):上廁所。

在這裡,我也想做一回導演,把上面的台詞改一下:

編程新手:您在實作類別中的一個方法時,第一步要做的事是什嗎?可以隨便說。
編程老手一聽可以隨便說,笑了。
編程老手(湊到新手的耳朵邊,輕聲地):參數有效性檢查。

大娘的回答鐵定不是導演希望聽到的,編程老手的回答恐怕也不是新手想要得到的。原因很簡單,與正題無關。但是參數有效性檢查之於方法實現的重要性決不亞於早上起來上廁所,箇中原因只可意會,不可言傳。這裡要討論的是如何在Java中進行參數有效性檢查。

說到參數有效性檢查,不得不說一下運行時異常。Java有兩種異常:一般異常與運行時異常。繼承自Exception的異常稱為一般異常,繼承自RuntimeException的異常稱為運行時異常。與一般異常最大的不同之處在於,函數調用方可以不必處理實現方拋出的運行時異常。 但是異常的拋出通常會被當成一種錯誤的發生。如果調用方可以不用處理運行時異常,那就意味著調用方必須盡量避免實現方拋出運行時異常。 例如:
public static boolean equalObject(Object obj1, Object obj2) {<br /> return obj1.equals(obj2);<br />}

上述代碼在obj1為null的場合下會拋出NullPointerException,為了避免這種情況發生,正確的寫法應該是:

public static boolean equalObject(Object obj1, Object obj2) {<br /> return (obj1 != null && obj1.equals(obj2));<br />}

可以看出,運行時異常是對函數調用方一種無形的約束,這種約束方式正好符合參數有效性檢查的要求,即調用方法時必須提供正確的參數,否則就會導致系統崩潰。例如我們通過物體的品質計算其重力值。實現方法如下:

public class Test {<br /> public static void main(String[] args) {<br /> System.out.println(getGravity(1.0));<br /> }</p><p> public static double getGravity(double mass) {<br /> return mass * 9.82;<br /> }<br />}

 

我們知道一般情況下一個1.0千克的物體其重力為9.82牛頓,但品質為負數的物體呢?物理常識告訴我們,世界上不存在品質為0或小於0的物體,據此我們應該如何完善重力的計算方法呢?

計算重力的第一步應該是對品質進行參數有效性檢查。Java SDK中提供了許多種運行時異常,與參數有效性檢查相關的異常是IllegalArgumentException。代碼實現可以如下:

public static double getGravity(double mass) {<br /> // 參數有效性檢查<br /> if (mass <= 0) {<br /> throw new IllegalArgumentException("無效品質:" + mass);<br /> }</p><p> return mass * 9.82;<br />}

 

當我們調用這樣一個計算重力的方法時,應該盡量傳遞有效品質值。當我們傳遞一個負值給此方法時,系統將會以拋出異常的方式退出。如:
public class Test {<br /> public static void main(String[] args) {</p><p> System.out.println(getGravity(1.0)); // 有效品質<br /> // 我們應該盡量避免下面的調用<br /> // System.out.println(getGravity(-1.0)); // 無效的品質<br /> }</p><p> public static double getGravity(double mass) {</p><p> // 參數有效性檢查<br /> if (mass <= 0) {<br /> throw new IllegalArgumentException("無效品質:" + mass);<br /> }</p><p> return mass * 9.82;<br /> }<br />}

參數有效性檢查應該作為常識來掌握,特別是Java中特有的參數有效性檢查。上面介紹的是最基本的用法,當然我們也可以利用第三方程式庫(如http://commons.apache.org/lang/" href="http://commons.apache.org/lang/" target="_blank">Apache Commons Lang 庫的Validate類)來簡化參數有效性檢查的過程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.