成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中如何避免空指針異常

移動開發
這對于我來說是一個很合理常見的問題,由初級過度到中級程序員的時候經常會遇到。他們不知道也不信任正在用的約定,并且小心的檢查著null。還有當他們寫代碼的時候,總是會依賴于通過返回空(NULL)來表明某些意義,因此需要調用者去檢查Null。

這對于我來說是一個很合理常見的問題,由初級過度到中級程序員的時候經常會遇到。他們不知道也不信任正在用的約定,并且小心的檢查著null。還有當他們寫代碼的時候,總是會依賴于通過返回空(NULL)來表明某些意義,因此需要調用者去檢查Null。

換種方式來說,有兩種情景空指針的檢查會出現:

 

就約定來說是一個合理的響應

不是合理的響應  

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

  1. assert <condition> 

或者

  1. assert <condition> : <object> 

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

如果condition為false的話,assert將會拋出一個Error(AssertionError).

默認Java會忽略斷言你可以通過在JVM中傳入一個-ea參數來啟用斷言,

你可以為單獨的一個包或者類啟動關閉assertions。這意味著你可以在開發和測試的時候通過斷言來驗證代碼,

在發布產品的時候關閉它,盡管我下面展示的測試中并沒有因為assertions而損失性能。

在這個代碼段中不用斷言也可以,因為他會運行失敗的,就像加了斷言一樣。唯一的區別是

有了斷言可能會發生的更快一些,更有意義,并且會附加一些額外的信息,而這可以幫助你弄明白

失敗的原因。

***種有一點棘手。如果你對不能控制正在調用的這段代碼,那你就卡住了。

如果Null是一個合理的返回值,你就應該檢查它。

如果是你能夠控制的代碼,那就是個完全不同的故事情景了.盡量避免用NULL作為返回值。

對于返回Collections的集合很容易,返回Empty(一個空集合或者數組),而不是一直用null作為返回值。

對于不是返回Collections的方法會有一點復雜。考慮下面這個例子:

  1. public interface Action { 
  2.   void doSomething(); 
  3.  
  4. public interface Parser { 
  5.   Action findAction(String userInput); 

Parser采用用戶的輸入作為參數,然后做一些事情(例如模擬一個命令行)。現在你可能會

返回null,如果沒找到對應輸入的動作的話,這就導致了剛才說過的空指針檢查。

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

  1. public class MyParser implements Parser { 
  2.   private static Action DO_NOTHING = new Action() { 
  3.     public void doSomething() { /* do nothing */ } 
  4.   }; 
  5.  
  6.   public Action findAction(String userInput) { 
  7.     // ... 
  8.     if ( /* we can't find any actions */ ) { 
  9.       return DO_NOTHING; 
  10.     } 
  11.   } 

比較這段代碼:

  1. Parser parser = ParserFactory.getParser(); 
  2. if (parser == null) { 
  3.   // now what? 
  4.   // this would be an example of where null isn't (or shouldn't be) a valid response 
  5. Action action = parser.findAction(someInput); 
  6. if (action == null) { 
  7.   // do nothing 
  8. else { 
  9.   action.doSomething(); 

和這段:

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

這是個更好的設計,因為足夠簡潔,避免了多余的判斷。即便如此,或許比較合適的設計是:findAction()方法之惡杰拋出一個異常,其中包含一些有意義的錯誤信息-----特別是在這個案例中你依賴于用戶的輸入。讓findAction()方法拋出一個異常而不是簡單的產生一個沒有任何解釋的NullPointerException 要好得多。

  1. try { 
  2.     ParserFactory.getParser().findAction(someInput).doSomething(); 
  3. catch(ActionNotFoundException anfe) { 
  4.     userConsole.err(anfe.getMessage()); 

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

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

 

責任編輯:倪明
相關推薦

2023-10-08 11:09:22

Optional空指針

2022-01-19 09:00:00

Java空指針開發

2022-01-04 23:13:57

語言PanicGolang

2019-11-21 08:51:56

Java異常控制流

2021-02-28 21:47:51

Java語法糖算數

2021-05-12 07:03:25

Switch報空指針

2021-11-15 06:56:45

系統運行空指針

2024-02-01 12:09:17

Optional容器null

2024-02-28 09:03:20

Optional空指針Java

2024-10-15 15:58:11

2015-09-22 10:56:13

Java反模式

2015-10-10 11:23:17

Java常量反模式

2020-08-20 08:23:52

VueDOM運算符

2017-10-25 20:52:03

內核權限空指針異常

2015-01-05 10:01:20

Java

2020-11-02 07:43:33

前端空指針數據

2024-08-12 08:28:35

2024-04-02 11:22:01

死鎖Java并發

2022-05-26 09:51:50

JavaScrip內存泄漏

2021-05-20 08:51:33

設計驅動數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品视频二区三区 | 午夜精品一区二区三区在线视频 | 国产成人精品一区二区三区视频 | 丝袜美腿一区 | 国产精品精品视频一区二区三区 | 精品久久久久久亚洲精品 | www.一级片 | 久久综合爱 | 美女黄18岁以下禁止观看 | 亚洲男人的天堂网站 | 日本免费在线看 | 伊人91在线| 激情毛片 | 成人精品在线观看 | 黄色网址在线免费观看 | 国产激情在线 | 九九热这里只有精品在线观看 | 在线亚洲人成电影网站色www | 久久99精品国产自在现线小黄鸭 | 中文字幕欧美一区二区 | 日韩精品视频在线观看一区二区三区 | 精品久久电影 | 性欧美hd| 久久久久亚洲精品 | 一区二区三区四区免费视频 | 免费黄色大片 | 一区二区三区在线免费观看 | 国产日韩电影 | 成人小视频在线观看 | 性欧美精品一区二区三区在线播放 | 成人精品国产免费网站 | 黄色一级大片视频 | 国产做a爱免费视频 | 午夜在线视频 | 毛片视频免费观看 | 国产69久久精品成人看动漫 | 91福利在线观看 | 国产精品美女www | 99精品视频在线 | 亚洲风情在线观看 | 日本色婷婷 |