最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中空指針異常該如何避免詳解

 更新時間:2022年03月28日 08:59:04   作者:學習Java中  
空指針(Null Pointer Exception,NPE)是Java中最常見不過的異常了,其原因雖然顯而易見,但是開發(fā)人員往往會忽略,或未能及時采取措施,下面這篇文章主要給大家介紹了關于Java中空指針異常該如何避免的相關資料,需要的朋友可以參考下

Java中如何避免空指針異常,這也是由初級程序員成長到中級程序員的時候經(jīng)常會遇到的問題。

程序員不知道或不信任正在使用的約定,并且小心的檢查著null。還有當程序員寫代碼的時候,總是會依賴于通過返回空(NULL)來表明某些意義,因此需要調(diào)用者去檢查Null。

有兩種空指針的檢查場景:

  • 期望的結果就是null。
  • 期望的結果不是null。

第二種很簡單,可以通過用assert或者允許程序報錯,例如拋出NullPointerException。Assertions是一個從Java1.4加進來的高度未被利用的特性,語法是:

assert <condition>

或者

assert <condition> : <object>

condition是一個布爾表達式,object是一個對象(其toString()方法的輸出將會被包含在錯誤里)。

校對注:我測試了下,JDK1.4及其以上,運行前設置vm參數(shù)-ea

public static void main(String[] args) {String name = null;assert (name != null) : "name為空null";}
Exception in thread "main"; java.lang.AssertionError: 變量name為空nullat LogUtil.main(LogUtil.java:37)

如果condition為false的話,assert將會拋出一個Error(AssertionError)。默認Java會忽略斷言你可以通過在JVM中傳入一個-ea參數(shù)來啟用斷言。

你可以為單獨的一個包或者類啟動關閉assertions。這意味著你可以在開發(fā)和測試的時候通過斷言來驗證代碼,在發(fā)布產(chǎn)品的時候關閉它,盡管我下面展示的測試中并沒有因為assertions而損失性能。在這個代碼段中不用斷言也可以,因為他會運行失敗的,就像加了斷言一樣。唯一的區(qū)別是有了斷言可能會發(fā)生的更快一些,更有意義,并且會附加一些額外的信息,而這可以幫助你弄明白失敗的原因。

第一種有一點棘手。如果你對不能控制正在調(diào)用的這段代碼,那你就卡住了。如果Null是一個合理的返回值,你就應該檢查它。如果是你能夠控制的代碼,那就是個完全不同的故事情景了。盡量避免用NULL作為返回值。對于返回Collections的集合很容易,返回Empty(一個空集合或者數(shù)組),而不是一直用null作為返回值。對于不是返回Collections的方法會有一點復雜。考慮下面這個例子:

public interface Action {
  void doSomething();}public interface Parser {
  Action findAction(String userInput);}

Parser采用用戶的輸入作為參數(shù),然后做一些事情(例如模擬一個命令行)?,F(xiàn)在你可能會返回null,如果沒找到對應輸入的動作的話,這就導致了剛才說過的空指針檢查。

一個可選的解決方案是永遠不要返回null,而是返回一個空對象

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }}

比較這段代碼:

Parser parser = ParserFactory.getParser();if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {
  // do nothing} else {
  action.doSomething();}

和這段:

ParserFactory.getParser().findAction(someInput).doSomething();

這是個更好的設計,因為足夠簡潔,避免了多余的判斷。

即便如此,或許比較合適的設計是:findAction()方法之惡杰拋出一個異常,其中包含一些有意義的錯誤信息—–特別是在這個案例中你依賴于用戶的輸入。

讓findAction()方法拋出一個異常而不是簡單的產(chǎn)生一個沒有任何解釋的NullPointerException 要好得多。

try {
    ParserFactory.getParser().findAction(someInput).doSomething();} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());}

或者你認為try/catch 的機制太丑了,你的action應該跟用戶提供一個反饋而不是什么都不做:

public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }}

補充:個人在做項目時,對NullPointerException的幾點總結,請網(wǎng)友拍磚?。。《喽嗵嵋庖?,

1.對于別人接口的返回對象要做非空判斷,因為我們不清楚獲得的對象會不會為空,對于Collection Map 我一般會調(diào)用CollectionUtils MapUtils ,對于返回的String對象,我會調(diào)StringUtils.isNotEmpty()進行非空判斷。他們中isNotEmpty不僅判斷了NULL 還判斷了空集合和空串。例如從數(shù)據(jù)中查詢的結果。工作流中返回的定價URL

2. 對于自己創(chuàng)建的對象,要留心對象進行哪些操作,中間會不會造成對象為空,如果可能加非空判斷,尤其是對于集合的操作,很容易就報空指針?。?!所以每次對操作集合時,我都會非常的留心。

3. 對于前臺的領域對象要非常的留心,因為這些對象是框架創(chuàng)建的,假如我沒有在前臺的文本框內(nèi)輸入值,雖然提交時后臺獲得的是空串,但發(fā)生NullPointerException的概率很高。

4. 對于String 的操作盡量使用apache 的StringUtils類,與String相比這個是非常的安全。對于集合的操作使用apache的CollectionUtils 、MapUtils, 相比apache工具類的執(zhí)行效率也非常的高,比如StringUtils.split();

有人說過多的判斷會影響性能,我個人認為這里的性能犧牲和系統(tǒng)的安全相比是微不足道的。

總結

到此這篇關于Java中空指針異常該如何避免的文章就介紹到這了,更多相關Java空指針異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

体育| 大石桥市| 灵山县| 上杭县| 垫江县| 鹤峰县| 苍梧县| 巫山县| 灵宝市| 聊城市| 磐安县| 沙河市| 勐海县| 晋宁县| 内黄县| 南靖县| 库伦旗| 报价| 祁阳县| 宁陵县| 鸡东县| 福海县| 迭部县| 江陵县| 喀喇沁旗| 西安市| 曲靖市| 兴安盟| 武冈市| 呼伦贝尔市| 茶陵县| 绥中县| 马山县| 井陉县| 深圳市| 石林| 铅山县| 西林县| 安阳市| 洛扎县| 邢台县|